1. 内存启动参数
1.1 -Xms -Xmx
-Xms是JVM启动时申请的最小Heap内存,默认为物理内存的1/64
-Xmx是JVM启动时申请的最大Heap内存,默认为物理内存的1/4
当剩余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小
生产环境-Xms 与 -Xms 应当设置为相同值,避免Heap内存频繁调整。
1.2 -Xmn -XX:SurvivorRatio
堆内存分为 新生代 与 旧生代, 通过 -Xmn 可以指定新生代的大小
新生代中又分为 Eden 与 两块大小相同的 Survivor (s0/s1) , 通过 -XX:SurvivorRatio来调整Eden 和 Survivor的比例
1.3 -Xss
JVM方法栈为线程私有,当方法执行完成后,其对应的栈帧所占用的内存也会自动释放。当JVM方法栈空间不足时,会抛出StackOverFlowError, 通过-Xss可以指定其大小
1.4 -XX:TLABWasteTargetPercent -XX:+PrintTLAB
Java对象所占用的内存主要从堆上进行分配,堆是所有线程共享的,因此在堆上分配内存时需要加锁,导致创建对象的开销很大。当堆上空间不足时,会触发GC,如果GC后空间仍然不足,则会抛出OutOfMemory错误信息。
为了提升内存分配的效率,会为每个新创建的线程在新生代的Eden Space上分配一块独立的空间,这块空间被称为TLAB, 通过-XX:TLABWasteTargetPercent设置TLAB占用的Eden Space的百分比,默认值为1%
在TLAB上分配内存时不需要加锁,因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配,如果对象过大或者TLAB空间已用完,则会在堆上进行分配,因此创建多个小对象会比创建一个大对象高效,可以使用 -XX:+PrintTLAB查看TLAB空间的使用情况。
1.5 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGC/-verbose:gc GC的简要信息
-XX:+PrintGCDetails GC详细信息
-XX:+PrintGCTimeStamps GC时间信息
-XX:+PrintGCApplicationStoppedTime GC造成应用停顿时间
1.6 -Xloggc:gc.log
将GC信息输出到 gc.log
2. 内存查看参数
2.1 jmap
jmap -head [pid] 查看JVM中各代的内存情况
jmap -histo [pid] 查看JVM堆中对象的详细占用情况
jmap -dump:format=b, file=文件名 [pid] 导出整个JVM中的内存信息
配合 MAT 使用
2.2 jstat -gcutil [pid] [interval]

S0/S1: Survivor空间的使用率
E: Eden空间的使用率
O: 老年代空间的使用率
M: 元空间使用率
CCS: 类指针压缩空间使用率
YGC: minor GC的执行次数
YGCT: minor GC执行消耗的时间
FGC: Full GC的执行次数
FGCT: Full GC 执行消耗的时间
GCT: Minor GC + Full GC 执行消耗的时间
