栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java虚拟机常见内存溢出错误汇总

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java虚拟机常见内存溢出错误汇总

一、引言

从事java开发的小伙伴在平时的开发工作中,应该会遇见各式各样的异常和错误,在实际工作中积累的异常或者错误越多,趟过的坑越多,就会使我们编码更加的健壮,就会本能地避开很多严重的坑。以下介绍几个Java虚拟机常见内存溢出错误。以此警示,避免生产血案。

二、模拟Java虚拟机常见内存溢出错误

1、内存溢出之栈溢出错误

package com.jayway.oom; 
 

 public class StackOverflowErrorDemo { 
 
 public static void main(String[] args) { 
  stackOverflowError(); 
 } 
 
 private static void stackOverflowError() { 
  stackOverflowError(); 
 } 
 
}

2、内存溢出之堆溢出错误

package com.jayway.oom; 
 
import java.util.Random; 
 

 public class JavaHeapSpaceErrorDemo { 
 
 public static void main(String[] args) { 
  String temp = "java"; 
  //不断地在堆中开辟空间,创建对象,撑爆堆内存
  while (true) { 
    temp += temp + new Random().nextInt(111111111) + new Random().nextInt(222222222); 
    temp.intern(); 
  } 
 } 
}

3、内存溢出之GC超过执行限制错误

package com.jayway.oom; 
 
import java.util.ArrayList; 
import java.util.List; 
 

 public class GCOverheadErrorDemo { 
 
  public static void main(String[] args) { 
    int i = 0; 
    List list = new ArrayList<>(); 
    try { 
      while (true) { 
      list.add(String.valueOf(++i).intern()); 
      } 
    } catch (Throwable e) { 
      System.out.println("*****************i:" + i); 
      e.printStackTrace(); 
      throw e; 
    } 
  } 
}

4、内存溢出之直接内存溢出错误

package com.jayway.oom; 
 
import java.nio.ByteBuffer; 
 

 public class DirectBufferMemoryErrorDemo { 
 
  public static void main(String[] args) { 
    //默认JVM配置的最大直接内存是总物理内存的四分之一 
    long maxDirectMemory = sun.misc.VM.maxDirectMemory() / 1024 / 1024; 
    System.out.println("配置的maxDirectMemory:" + maxDirectMemory + "MB"); 
 
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 1024 * 1024); 
  } 
 
}

5、内存溢出之无法创建新的本地线程

package com.jayway.oom; 
 

 public class UnableCreateNativeThreadErrorDemo { 
 
  public static void main(String[] args) { 
    for (int i = 0; true; i++) { 
      System.out.println("***************i:" + i); 
 
      //不断得创建新线程,直到超过操作系统允许应用进程创建线程的极限 
      new Thread(() -> { 
 try { 
   Thread.sleep(Integer.MAX_VALUE); 
 } catch (InterruptedException e) { 
   e.printStackTrace(); 
 } 
      }).start(); 
    } 
  } 
}

6、内存溢出之元空间溢出错误

package com.jayway.oom; 
 
import org.springframework.cglib.proxy.Enhancer; 
import org.springframework.cglib.proxy.MethodInterceptor; 
import org.springframework.cglib.proxy.MethodProxy; 
 
import java.lang.reflect.Method; 
 

 public class metaspaceErrorDemo { 
 
  static class OOMTest { 
  } 
 
  public static void main(String[] args) { 
    int count = 0; 
 
    try { 
    //cglib不断创建类,模拟metaspace空间溢出,我们不断生成类往元空间中灌,超过元空间大小后就会抛出元空间移除的错误 
      while (true) { 
 count++; 
 Enhancer enhancer = new Enhancer(); 
 enhancer.setSuperclass(OOMTest.class); 
 enhancer.setUseCache(false); 
 enhancer.setCallback(new MethodInterceptor() { 
   @Override 
   public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { 
     return methodProxy.invokeSuper(o, args); 
   } 
 }); 
 enhancer.create(); 
      } 
    } catch (Throwable e) { 
      System.out.println("************多少次后发生了异常:" + count); 
      e.printStackTrace(); 
    } 
  } 
}

以上就是Java虚拟机常见内存溢出错误汇总的详细内容,更多关于Java虚拟机内存溢出的资料请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/131829.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号