初识JVM调优

初识JVM调优

关于jvm调优,其实大多数项目不需要jvm调优,需要调优的往往是比较极端的业务。

是否需要调优

一般项目不需要调优,加xms和xmx参数就可以了。即使是高并发服务也不需要调优,jvm本身就是为低延时、高并发、大吞吐的服务设计和优化的。

1
java -Xms1g -Xmx2g -jar abc.jar

对于项目来说,主要还是要将精力放在项目本身的调优。

jvm调优的前提是对服务的全面监控和性能数据的收集以及我们对jvm的运行原理的非常熟悉。

首先需要了解系统的运行状况,如果系统的响应时间很短,资源占用也不高,那么这种调优是没什么意义的。
系统运行状况参数:

  • 响应时间
  • TPS(每秒处理事务数量)
  • 资源占用量(系统性能受限于最差的那个)

jvm调优主要针对一些极端的项目,比如一些对吞吐量要求高而对时延要求不高的服务,就像12306。
针对12306这种服务,可能需要调整一些参数,比如让gc中的generation分布更加合理。

如何调优

jvm调优主要包括:1. 合理分配jvm内存空间。2. 选择适合的gc回收器。

  1. 合理分配jvm内存空间:jvm内存分配不合理的表现是频繁的gc从而降低系统的吞吐量和增加响应时间。

主要方法是调整堆内存空间以减少Full GC,调整新生代减少MinorGC,设置合理的Eden和Survivor区的比例。

  1. 选择合理的垃圾回收器

垃圾回收主要回收堆(主要是对象)和方法区(主要是废弃常量和类),需要响应快可以选择CMS和G1,需要吞吐高可以选择Parallel Scavenge。

jvm调优大部分调的是gc参数,主要是下面几点:

  • 最大堆和最小堆的大小
  • gc算法
  • 新生代的大小

jdk8及以前:gc算法会自动在Parallel和CMS中选择,新生代根据经验调节大小,这样就达到了性能和STW的平衡。

jdk9开始的版本:gc默认算法变为G1,只需要调整最大堆大小和STW期望值既可。

评论