一、相关虚拟机参数了解
1.1、配置堆的大小
-Xmx100m -Xms100m
1.2、新生代大小
-Xmn20m
# 伊甸园 和 survivor 区的比例
-XX:SurvivorRatio
# 新生代和老年代的比例
-XX:NewRatio
1.3、方法区大小
# java7
-XX:MaxPermSize=8m
# java8
-XX:MaxMetaspaceSize=20m
1.4、dump 导出
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/server/oom
1.5、直接内存
-XX:MaxDirectMemorySize=8m
二、相关案例
2.1、堆溢出
//指定堆大小 -Xmx8m -Xms8m
public class JavaHeapSpaceDemo {
public static void main(String[] args) {
byte[] bytes = new byte[8 * 1014 * 1024];
}
}
2.2、虚拟机栈的溢出
// java8 -XX:MaxMetaspaceSize=20m
// java7 -XX:MaxPermSize=8m
/**
* 使用 CGLib 不断创建class 信息到元空间
*
* @param args
*/
public static void main(String[] args) {
int i = 0;
try {
for (; ; ) {
i++;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(PermGenOOMDemo.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o, args);
}
});
enhancer.create();
}
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
2.3、本地方法栈OOM
//谨慎执行,会导致电脑卡死
for (; ; ) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
2.4、直接内存OOM
//-XX:MaxDirectMemorySize=8m
public class DirectMemoryDemo {
public static void main(String[] args) {
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(9 * 1024 * 1024);
}
}