一、相关虚拟机参数了解
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 -Xms8mpublic 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=8mpublic class DirectMemoryDemo { public static void main(String[] args) { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(9 * 1024 * 1024); }}