1、JVM分析指令
1.1 jinfo—查看JVM配置参数1.2 jmap—查看JVM堆内存信息1.3 jstat—查看JVM统计信息 (★) 2、频繁的GC3、JVM配置推荐原则4、常见VM设置参数
1、JVM分析指令 1.1 jinfo—查看JVM配置参数命令:
jinfo
功能:
1、查看正在运行的应用程序的JVM参数和系统参数。
2、动态修改正在运行的应用程序的JVM参数。
3、可以从core文件中,获取已经崩溃的应用程序的配置信息。
使用:
# 基本使用,pid可以通过jps查看 jinfo [options] pid # 属性参数使用说明 # 打印系统属性 -sysprops # 打印所有的VM参数 -flags # 获取指定name属性值 -flag name # 开启、关闭bool类型的属性 -flag [+/-]name # 设置VM参数 -flag name=value # 同时打印系统参数和VM参数
实例:
命令:
jmap
功能:
1、查看堆使用的GC算法、配置信息和内存使用情况。
2、查看堆中对象的统计信息。
3、打印正等待回收的对象信息。
4、生成堆信息的快照文件,然后通过jhat以html的方式进行查看。
使用:
# 基本使用 jmap [option]# 属性参数使用说明 # 打印堆信息 -heap # 打印对象的[存活]统计信息 -histo[:live] # 打印类加载信息 -clstats # 打印正等待回收的对象信息[一般GC频繁时有数据] -finalizerinfo # 生成快照文件 -dump:live,format=b,file=fileName.bin # 使用jhat命名以html方式查看
实例:
命令:
jstat
功能:
查看虚拟机中的类装载、内存、垃圾回收、运行期编译等数据。
使用:
# 基本使用 jstat option# 属性参数使用说明 # 打印类装载信息 -class # 编译统计信息 -compiler # 打印垃圾回收GC统计信息 - 最常用 -gc [time,num] # 表示每time毫秒查询一次统计信息,一共查询num次 # 内存占用大小和内存使用情况 -gccapacity # 分代查询GC信息 -gcnew 或者 -gcnewcapacity :年轻代 -gcold 或者 -gcoldcapacity :老年代
实例:
-gc 垃圾回收GC统计信息统计信息 主要参数说明
# 内存参数,单位大小为kb S0C S1C :新生代Survivor区大小 S0U S1U :新生代Survivor区已使用空间 EC :新生代Eden区大小 EU :新生代Eden区已使用空间 OC :老年代大小 OU :老年代已使用空间 # GC执行次数与耗时(秒) YGC :YoungGC执行次数 YGCT :YoungGC执行时间 FGC :FullGC执行次数 FGCT :FullGC执行时间 GCT :程序启动到采用时,GC总耗时
-gccapacity GC内存使用情况 主要参数说明
# 内存信息参数,单位大小为kb NGCMN :年轻代初始化容量 NGCMX :年轻代最大容量 NGC : 年轻代当前容量 OGCMN :老年代初始化容量 OGCMX :老年代最大容量 OGC : 老年代当前容量2、频繁的GC
MinorGC与MajorGC:
原因:
当年轻代的内存空间不足时就会出现频繁的MinorGC,老年代不足时就会出现频繁的MajorGC。
影响:
降低系统的响应速度。
注意:
增加MinorGC可能会增加单次MinorGC的时间,因为年轻代空间越大SurviorFrom区域的存活对象可能就越多,在从SurvivorFrom区域复制到SuvivorTo区域的耗时就越多,当Eden区增加一倍时,MinorGC的次数会减少一半。
如果应用存在大量的短期对象,应该适当增加年轻代;如果存在大量的持久化对象,应该适当增加老年代。
FullGC
原因:
堆中分配了大对象,当老年代空间不足时,就会发生频繁的FullGC。
影响:
FullGC发生时进程会暂停响应,降低系统性能。
默认原则:
| 空间 | 命令行(比如) | 配置 |
|---|---|---|
| 堆 | -Xms1024M、-Xmx1024M | 1/4机器内存 |
| 年轻代 | -Xmn256M | 3/8整堆大小 |
| Eden与Survivor比列 | -XX:SurvivorRatio=8 | 8 |
| 年轻代与老年代占比 | -XX:NewRatio=2 | 如果配置了年轻代,则不需要该参数配置 |
优化原则:
| 空间 | 命令行(比如) | 配置 |
|---|---|---|
| 堆 | -Xms1024M、-Xmx1024M | 3~4倍FullGC后老年代占用量 |
| 年轻代 | -Xmn256M | 1-1.5倍FullGC后老年代占用量 |
| Eden与Survivor比列 | -XX:SurvivorRatio=8 | 8 |
| 年轻代与老年代占比 | -XX:NewRatio=2 | 如果配置了年轻代,则不需要该参数配置 |
注意:老年代大小 = 堆大小 - 年轻代大小
4、常见VM设置参数配置参数:
-Xms1g:设置虚拟机的初始内存,默认是物理内存的 1/64。-Xmx1g:设置虚拟机的最大可用内存,默认是物理内存的 1/4。-Xmn512m:设置新生代的大小。-Xss1m:设置每个线程堆栈的大小,虚拟机的最小值限制为 160k,如果小于这个值将报错。-XX:metaspaceSize=128m:默认是21m,调整 metaSpace 的大小。-XX:NewRatio=2:设置新生代和老年代的比值,默认是2,即如果堆是300兆,则年轻代占100兆。-XX:SurvivorRatio=8:设置新生代中 Eden 区与 Survivor 区的比值,默认为8,即 Eden 占 8 份,S1 占 1 份,S2 占 1 份。如果新生代时10M,则 Eden 区占 8 M,其余两个各占 1 M。-XX:metaspaceSize=100m 设置元空间大小,默认是21兆左右。
GC堆日志打印参数:
配置参数可以通过:jinfo -flag [+/-]name 动态设置
-XX:+PrintGC:打印简单的 GC 日志。-XX:+PrintGCDetails:打印详细的 GC 日志。-XX:+PrintGCTimeStamps :打印自虚拟机启动以来所经过的时间。-XX:+PrintGCApplicationConcurrentTime :打印每次垃圾回收前,程序未中断的执行时间。-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。-XX:+PrintHeapAtGC:在发生 GC 时打印出堆栈详情。-Xloggc:log/gc.log:配置GC日志输出文件位置。



