jvm优化

为什么需要对JVM优化

  • 运行的程序卡住了,日志不输出,程序没有反应

  • 服务器负载突然升高

  • 在多线程应用下,如何合理分配线程数量

JVM运行参数

JVM的参数分为三类:

  • 标准参数(不会发生变化)

    • -help

    • -version

  • -X参数(非标准参数,可能会发生变化)

    • -Xint

    • -Xcomp

  • -XX参数(使用率较高,多用于JVM调优)

    • -XX:newSize

    • -XX:+UseSerialGC

标准参数

jvm的标准参数,一般都很稳定,在未来的JVM版本中不会改变,可以使用 java -help检索出所有的标准参数。

-version 与 -showversion

使用-version查看JDK的版本

-D 设置main方法参数

可以使用-D为Java设置系统属性,可以在使用 System.getProperty("参数名称")获取:

注意,-D参数是JVM运行参数,指定的是系统属性,要区别Program Arguments,main方法参数。

-server 和 -client

可以通过-server-client设置jvm的模式:

  • Server VM的初始空间会大一些,默认使用并行垃圾回收器,启动慢运行快

  • Client VM 相对保守,初始化空间比较小,使用串行垃圾回收器,目标是让JVM启动速度更快,但是运行速度会比Server VM慢一些

  • JVM在启动时会根据硬件和操作系统自动选择Server还是Client类型的JVM

    • 32位Windows系统,无论硬件如何,都会默认使用Client VM

    • 其他操作系统中,2G以上并且拥有2个CPU,将会默认使用 Server VM

    • 如果是64位操作系统,只会使用Server VM,不支持Client VM

测试

-X 非标准参数

查看所有非标准参数

-Xint、-Xcomp、-Xmixed

-Xint-Xcomp-Xmixed用于指定JVM的运行模式:

  • -Xint:解释模式(interpreted mode),会强制JVM执行所有的字节码,这回降低运行速度,通常低10倍或者更多

  • -Xcomp:会将所有字节码编译为本地代码,再去执行,从而得到最大程序优化。但是编译时间会很长

  • -Xmixed: 是混合模式,将解释模式与编译模式进行混合使用,由jvm自己决定,这是 jvm默认的模式,也是推荐使用的模式

示例

-XX非标准参数(常用于JVM调优)

-XX参数也是非标准参数,主要用于JVM调优与Debug操作。他的参数值的指定有两种形式:

  • boolean 形式

  • 非boolean形式

示例:

查看所有的-XX参数

查看正在运行的JVM参数

需要借助jinfo命令查看:

-Xms 与 -Xmx

-Xms-Xmx是属于-XX参数的,虽然他只有一个-X,他们只是 -XX:InitialHeapSize-XX:MaxHeapSize 的缩写。

  • -Xms用于指定JVM堆的初始大小,比如-Xms512m,等价于-XX:InitialHeapSize=512m堆空间的初始大小为512M

  • -Xmx则用于指定JVM堆的最大堆内存大小,比如-Xmx2048m,等价于-XX:MaxHeapSize=2048M对空间的最大大小为2G

调整JVM内存大小,可以充分利用服务器资源,让程序跑的更快。

示例:

jstat监测统计堆内存

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:

class加载统计

说明:

  • Loaded:加载class的数量

  • Bytes:所占用空间大小

  • Unloaded:未加载数量

  • Bytes:未加载占用空间

  • Time:时间

编译统计

说明:

  • Compiled:编译数量。

  • Failed:失败数量

  • Invalid:不可用数量

  • Time:时间

  • FailedType:失败类型

  • FailedMethod:失败的方法

垃圾回收统计

说明:

  • S0C:第一个Survivor区的大小(KB)

  • S1C:第二个Survivor区的大小(KB)

  • S0U:第一个Survivor区的使用大小(KB)

  • S1U:第二个Survivor区的使用大小(KB)

  • EC:Eden区的大小(KB)

  • EU:Eden区的使用大小(KB)

  • OC:Old区大小(KB)

  • OU:Old使用大小(KB)

  • MC:方法区大小(KB)

  • MU:方法区使用大小(KB)

  • CCSC:压缩类空间大小(KB)

  • CCSU:压缩类空间使用大小(KB)

  • YGC:年轻代垃圾回收次数

  • YGCT:年轻代垃圾回收消耗时间

  • FGC:老年代垃圾回收次数

  • FGCT:老年代垃圾回收消耗时间

  • GCT:垃圾回收消耗总时间

jmap详细监测统计堆内存

jstat命令可以对jvm堆内存进行统计分析,而jmap可以获取到更加详细的内容。

最后更新于

这有帮助吗?