一、相关虚拟机参数了解
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);
-     }
- }