一、相关虚拟机参数了解

1.1、配置堆的大小

  1. -Xmx100m -Xms100m

1.2、新生代大小

  1. -Xmn20m
  2. # 伊甸园 和 survivor 区的比例
  3. -XX:SurvivorRatio
  4. # 新生代和老年代的比例
  5. -XX:NewRatio

1.3、方法区大小

  1. # java7
  2. -XX:MaxPermSize=8m
  3. # java8
  4. -XX:MaxMetaspaceSize=20m

1.4、dump 导出

  1. -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/server/oom

1.5、直接内存

  1. -XX:MaxDirectMemorySize=8m

二、相关案例

2.1、堆溢出

  1. //指定堆大小 -Xmx8m -Xms8m
  2. public class JavaHeapSpaceDemo {
  3. public static void main(String[] args) {
  4. byte[] bytes = new byte[8 * 1014 * 1024];
  5. }
  6. }

2.2、虚拟机栈的溢出

  1. // java8 -XX:MaxMetaspaceSize=20m
  2. // java7 -XX:MaxPermSize=8m
  3. /**
  4. * 使用 CGLib 不断创建class 信息到元空间
  5. *
  6. * @param args
  7. */
  8. public static void main(String[] args) {
  9. int i = 0;
  10. try {
  11. for (; ; ) {
  12. i++;
  13. Enhancer enhancer = new Enhancer();
  14. enhancer.setSuperclass(PermGenOOMDemo.class);
  15. enhancer.setUseCache(false);
  16. enhancer.setCallback(new MethodInterceptor() {
  17. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  18. return methodProxy.invokeSuper(o, args);
  19. }
  20. });
  21. enhancer.create();
  22. }
  23. } catch (Throwable throwable) {
  24. throwable.printStackTrace();
  25. }
  26. }

2.3、本地方法栈OOM

  1. //谨慎执行,会导致电脑卡死
  2. for (; ; ) {
  3. new Thread(()->{
  4. try {
  5. TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
  6. } catch (InterruptedException e) {
  7. e.printStackTrace();
  8. }
  9. }).start();
  10. }

2.4、直接内存OOM

  1. //-XX:MaxDirectMemorySize=8m
  2. public class DirectMemoryDemo {
  3. public static void main(String[] args) {
  4. ByteBuffer byteBuffer = ByteBuffer.allocateDirect(9 * 1024 * 1024);
  5. }
  6. }