Jvm 配置及优化

Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码 (字节码), 就可以在多种平台上不加修改地运行。
JVM是JAVA世界的核心,了解它有助于我们更好调试,调优和开发程序。

1. 命令

1.1. 查看 java pid项目

jps

1.2. 收集内存使用基本情况统计

jmap -heap [pid] > [路径]

如:jmap -heap 16155 > /opt/jmapheap jmapheap 是文件名称

1.3. 查看GC使用情况

jstat -gcutil [pid] [毫秒]

如:jstat -gcutil 16155 1000

1.4. 获取dump文件

jmap -dump:file=[文件名称] [pid]

如:jmap -dump:file=test.dump 16155, jmap在获取dump文件时候会停止应用注意,也可以hprof结尾

2. 常用配置

2.1. jvm 参数配置

-Xms1024m 
-Xmx1024m 
-Xmn512m 
-Xss256k 
-XX:NewRatio=4 
-XX:SurvivorRatio=4 
-XX:MetaspaceSize=256m 
-XX:MaxMetaspaceSize=256m 
-XX:TargetSurvivorRatio=90
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=$DIR 
-XX:MaxTenuringThreshold=15 
-XX:+UseConcMarkSweepGC 
-server
  • -Xmx 设置最大堆大小
  • -Xms 设置最小堆大小,最小堆跟最大堆,最好保持一致以免 动荡的 java 堆
  • -Xmn 设置年轻代大小
  • -Xss 设置每个线程的堆栈大小。
  • -XX:NewRatio 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
  • -XX:SurvivorRatio 设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
  • -XX:MetaspaceSize 设置元数据大小。
  • -XX:MaxMetaspaceSize 设置最大元数据大小
  • -XX:TargetSurvivorRatio 在新生代的对象不一定要满足存活年龄达到MaxTenuringThreshold才能去老年代,当Survivor空间中相同年龄所有对象大小总和大于[Desired survivor size]时,年龄大于或等于该年龄的对象直接进入老年代。
  • -XX:MaxTenuringThreshold 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
  • -XX:SurvivorRatio: 指定NewGeneration中EdenSpace与一个SurvivorSpace的堆size比例,
  • XX:SurvivorRatio=8 ,那么在总共NewGeneration为10m的情况下,EdenSpace为8m
  • -XX:+UseConcMarkSweepGC: 指定在OldGeneration使用CMSGC,GCThread和APPThread并行(在init-mark和remark时PauseAPPThread)。apppause时间较短,适合交互性强的系统。

2.2. 看看GC次数

[root@localhost bin]# jstat -gcutil 4031 1000
 S0     S1     E      O      M     CCS    YGC      YGCT    FGC    FGCT     GCT   
0.00  56.81  72.20   2.77  96.20  94.35     19    0.768     0    0.000    0.768
0.00  56.81  72.20   2.77  96.20  94.35     19    0.768     0    0.000    0.768
0.00  56.81  72.45   2.77  96.20  94.35     19    0.768     0    0.000    0.768
0.00  56.81  72.45   2.77  96.20  94.35     19    0.768     0    0.000    0.768
0.00  56.81  72.45   2.77  96.20  94.35     19    0.768     0    0.000    0.768
0.00  56.81  72.45   2.77  96.20  94.35     19    0.768     0    0.000    0.768
0.00  56.81  72.45   2.77  96.20  94.35     19    0.768     0    0.000    0.768
0.00  56.81  72.45   2.77  96.20  94.35     19    0.768     0    0.000    0.768
0.00  56.81  72.45   2.77  96.20  94.35     19    0.768     0    0.000    0.768
  • S0 :幸存1区当前使用比例
  • S1 :幸存2区当前使用比例
  • E :伊甸园区使用比例
  • O :老年代使用比例
  • M :元数据区使用比例
  • CCS :压缩使用比例
  • YGCT :年轻代垃圾回收消耗总时间
  • FGC :老年代垃圾回收次数
  • FGCT :老年代垃圾回收消耗时间
  • GCT :垃圾回收消耗总时间

3. heap堆的配置

[root@localhost bin]# jmap -heap 4031
Attaching to process ID 4031, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.231-b11
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
   //最小空闲比率
   MinHeapFreeRatio         = 40
   //最大空闲比率
   MaxHeapFreeRatio         = 70
   //堆的最大大小
   MaxHeapSize              = 1073741824 (1024.0MB)
   //新生代的默认大小
   NewSize                  = 536870912 (512.0MB)
   //新生代的最大大小
   MaxNewSize               = 536870912 (512.0MB)
   //老年代的默认大小
   OldSize                  = 536870912 (512.0MB)
   NewRatio                 = 4
   SurvivorRatio            = 4
   //元空间的默认大小
   MetaspaceSize            = 268435456 (256.0MB)
   //类指针压缩空间的默认大小
   CompressedClassSpaceSize = 260046848 (248.0MB)
   //元空间的最大大小
   MaxMetaspaceSize         = 268435456 (256.0MB)
   //使用G1垃圾收集器的时候
   G1HeapRegionSize         = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 447414272 (426.6875MB)
   used     = 317350352 (302.6488800048828MB)
   free     = 130063920 (124.03861999511719MB)
   70.9298678786894% used
Eden Space: //Eden区域分配情况
   capacity = 357957632 (341.375MB)
   used     = 266528528 (254.18141174316406MB)
   free     = 91429104 (87.19358825683594MB)
   74.45812134548929% used
From Space: //其中一个Survivor区域分配情况
   capacity = 89456640 (85.3125MB)
   used     = 50821824 (48.46746826171875MB)
   free     = 38634816 (36.84503173828125MB)
   56.81168440934066% used
To Space: //另一个Survivor区域分配情况
   capacity = 89456640 (85.3125MB)
   used     = 0 (0.0MB)
   free     = 89456640 (85.3125MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 536870912 (512.0MB)
   used     = 14854688 (14.166534423828125MB)
   free     = 522016224 (497.8334655761719MB)
   2.7669012546539307% used
36932 interned Strings occupying 4449232 bytes.