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可以获取到更加详细的内容。
最后更新于
这有帮助吗?