一般的Java项目需要JVM调优吗?注意哪些?

wlaiwangling


首先,直接答复一次题主的问题,一般项目肯定是不需要进行JVM调优的,因为JVM 本身就是为这种低延时、高并发、大吞吐的服务设计和优化的,我们很少需要去改变什么。所以,我们往往更偏重于应用服务本身的调优。

在一些应用中,比如大数据计算引擎,是一种非常极端的JVM应用,对延时的要求并不高,但对吞吐量要求很高,会有大量的短生命周期对象产生,同时也有大量的对象生存时间非常久,我们就需要对特定的一些 JVM 参数进行修改,不断调整,做到最优。

再比如生产环境中出现内存溢出,我们需要判断是由于大峰值下没有限流,瞬间创建大量对象而导致的内存溢出,还是是由于内存泄漏而导致的内存溢出。对于内存泄漏导致的,这种问题就是程序的 Bug,我们需要及时找到问题代码进行修改,而不是调整 JVM。

如果要调优,需要有参考指标,不要为了调优而调优,要有一个目标参考值,最终要达到什么样的调优结果,没有指标的调优都是瞎指挥!以下列出几个衡量系统性能的常用指标:

  • 响应时间:响应时间是衡量系统性能的重要指标之一,响应时间越短,性能越好,一般一个接口的响应时间是在毫秒级。响应时间还包括数据库响应时间、服务端响应时间、网络响应时间、客户端响应时间。
  • TPS:指系统接口的 TPS(每秒事务处理量),因为 TPS 体现了接口的性能,TPS 越大,性能越好。在系统中,吞吐量分为两种:磁盘吞吐量和网络吞吐量。
  • 计算机资源分配使用率:通常由 CPU 占用率、内存使用率、磁盘 I/O、网络 I/O 来表示资源使用率。这几个参数好比一个木桶,如果其中任何一块木板出现短板,任何一项分配不合理,对整个系统性能的影响都是毁灭性的。

对于JVM调优来说,主要关注以下两方面:JVM内存空间分配参数设置和垃圾回收器的选择。

  • 内存空间的分配设置:JVM 内存分配不合理带来的性能表现并不会像内存溢出问题这么突出,最直接的表现就是频繁的 GC,这会导致上下文切换等性能问题,从而降低系统的吞吐量、增加系统的响应时间。具体的实现包括调整堆内存空间减少 Full GC、调整年轻代减少 MinorGC、设置合理的 Eden 和 Survivor 区的比例。
  • 选择合适的垃圾回收器:垃圾回收主要是指堆和方法区的回收,堆中的回收主要是对象的回收,方法区的回收主要是废弃常量和无用的类的回收。垃圾收集器的种类很多,不同的场景有不同的选择。对于每次操作的响应时间要求比较高的,我们可以选择响应速度较快的 GC回收器,比如 CMS 回收器和 G1 回收器;而对系统吞吐量有较高要求时,就可以选择 Parallel Scavenge 回收器来提高系统的吞吐量。

Java实战技术


一般项目还真不用,随便配置个1G的堆内存够用,除非遇到oom问题或者效率实在有问题而其他方面已经优化。



暖宝宝爸


F:\\soft\\Java\\jdk1.8\\bin>jcmd -hUsage: jcmd <command>or: jcmd -lor: jcmd -hcommand must be a valid jcmd command for the selected jvm.Use the command "help" to see which commands are available.If the pid is 0, commands will be sent to all Java processes.The main class argument will be used to match (either partiallyor fully) the class used to start Java.If no options are given, lists Java processes (same as -p).PerfCounter.print display the counters exposed by this process-f read and execute commands from the file-l list JVM processes on the local machine-h this help ------------- 如果我回答对你有帮助,请关注我一下。或有其他问题也可以关注我,给我发私信/<command>


草莓爱旅行


下载下来的jvm已经调试好了,除非无法满足使用需求,否则不要轻易修改


分享到:


相關文章: