一 点睛
# 栈
-Xss128k <==> -XX:ThreadStackSize=128k 设置每个线程栈的大小为128K
# 堆
-Xms2048m <==> -XX:InitialHeapSize=2048m 设置 JVM 初始堆内存为2048M
-Xmx2048m <==> -XX:MaxHeapSize=2048m 设置 JVM 最大堆内存为2048M
-Xmn2g <==> -XX:NewSize=2g -XX:MaxNewSize=2g 设置年轻代大小为2G,官方推荐配置为整堆的3/8
-XX:NewSize=2g 设置年轻代的初始值为 2g
-XX:MaxNewSize=2g 设置年轻代的最大值为 2g
-XX:SurvivorRatio=8 设置 Eden 区与 Survivor 区的比值,默认为 8
-XX:NewRatio=2 设置老年代与年轻代的比例,默认为 2
-XX:+UseAdaptiveSizePolicy 设置大小比例自适应,默认开启
-XX:PretenureSizeThreadshold=1024 设置让大于此阈值的对象直接分配在老年代,只对 Serial、ParNew 收集器有效
-XX:MaxTenuringThreshold=15 设置新生代晋升老年代的年龄限制,默认为 15
-XX:PrintTenuringDistribution 让 JVM 在每次 MinroGC 结束后打印出当前使用的 Survivor 中对象的年龄分布
-XX:TargetSurvivorRatio 设置 MinorGC 结束后 Survivor 区占用空间的期望比例
# 方法区
-XX:MetaspaceSize / -XX:PermSize=256m 设置元空间/永久代初始值为256M
-XX:MaxMetaspaceSize / -XX:MaxPermSize=256m 设置元空间/永久代最大值为256M
-XX:+UseCompressedOops 使用压缩对象指针
-XX:+UseCompressedClassPointers 使用压缩类指针
-XX:CompressedClassSpaceSize 设置 Klass Metaspace 的大小,默认1G
# 直接内存
-XX:MaxDirectMemorySize 指定 DirectMemory 容量,默认等于 Java 堆最大值
二 实战
1 代码
package chapter03;
import java.util.ArrayList;
import java.util.Random;
/**
* -Xms600m -Xmx600m -XX:SurvivorRatio=8 -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:+PrintFlagsFinal
* 老年代:400m
* 伊甸园:160m
* s0:20m
* s1:20m
*/
public class OOMTest {
public static void main(String[] args) {
ArrayList<Picture> list = new ArrayList<>();
while (true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(new Picture(new Random().nextInt(100 * 50)));
}
}
}
class Picture {
private byte[] pixels;
public Picture(int length) {
this.pixels = new byte[length];
}
}
2 当参数选项配置为 -Xms600m -Xmx600m
3 当参数选项配置为 -Xms600m -Xmx600m -XX:-UseAdaptiveSizePolicy
4 当参数选项配置为 -Xms600m -Xmx600m -XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8
5 当选项配置为 -Xms600m -Xmx600m -XX:+UseAdaptiveSizePolicy -XX:SurvivorRatio=8
6 结论
-XX:SurvivorRatio 优先级高于 -XX:+UseAdaptiveSizePolicy
但建议将 UseAdaptiveSizePolicy 开启,但不设置 -XX:SurvivorRatio