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