Java出现内存溢出的原因是什么

  介绍

小编给大家分享一下Java出现内存溢出的原因是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

1。JVM堆(堆)溢出:. lang。OutOfMemoryError: Java堆空间

JVM在启动的时候会自动设置JVM堆的值,可以利用JVM提供的厦门xms - xmx等选项可进行设置.Heap的大小是年轻一代和终身我厂之和。在JVM中如果98%的时间是用于GC,且可用的堆大小不足2%的时候将抛出此异常信息。
解决方法:手动设置JVM堆(堆)的大小。

Java堆用于储存对象实例。当需要为对象实例分配内存,而堆的内存占用又已经达到- xmx设置的最大值。将会抛出OutOfMemoryError异常。例子如下:

package  com.demo.test;      import  java.util.ArrayList;   import 并不知道;/* *   ,* VM 参数:-Xms5m  -Xmx5m   ,*/public  class  HeapOOM  {   ,,   public 才能;static  void  main (String [], args), {   ,,,int  count =, 0;   ,,,List, list =, new  ArrayList ();   ,,,,(真正的){   ,,,,,list.add (new 对象());   ,,,,,System.out.println(+ +数);   ,,,}   ,,}      }

然后在运行时设置jvm参数,如下:

癑ava出现内存溢出的原因是什么"

- xmx为5米,其中的一次测试结果为,当计数的值累加到360145时,发生如下异常:

异常的线程“main". lang。OutOfMemoryError: Java堆空间
在java.util.Arrays.copyOf (Arrays.java: 2245)
java.util.Arrays.copyOf (Arrays.java: 2219)
java.util.ArrayList.grow (ArrayList.java: 213)
java.util.ArrayList.ensureCapacityInternal (ArrayList.java: 187)
java.util.ArrayList.add (ArrayList.java: 411)
com.demo.test.HeapOOM.main (HeapOOM.java: 12)

修改- xmx为10 m。其中的一次测试结果为,当计数的值累加到540217时,发生OutOfMemoryError异常。随着- xmx参数值的增大,Java堆中可以存储的对象也越多。

2. permgen空间溢出:. lang。OutOfMemoryError: PermGen空间

PermGen空间的全称是永久代空间,是指内存的永久保存区域。为什么会内存溢出,这是由于这块内存主要是被JVM存放类和元信息的,在类被加载的时候被放入PermGen空间区域,它和存放实例的堆区域不同,太阳的GC不会在主程序运行期对PermGen空间进行清理,所以如果你的应用程序会载入很多类的话,就很可能出现PermGen空间溢出。一般发生在程序的启动阶段。
解决方法:通过- xx: PermSize和- xx: MaxPermSize设置永久代大小即可。

方法区用于存放java类型的相关信息,如类名,访问修饰符,常量池,字段描述,方法描述等。在类装载器加载类文件到内存的过程中,虚拟机会提取其中的类型信息,并将这些信息存储到方法区。当需要存储类信息而方法区的内存占用又已经达到- xx: MaxPermSize设置的最大值,将会抛出OutOfMemoryError异常。对于这种情况的测试,基本的思路是运行时产生大量的类去填满方法区,直到溢出。这里需要借助CGLib直接操作字节码运行时,生成了大量的动态类。例子如下:

package  com.demo.test;      import  java.lang.reflect.Method;      import  net.sf.cglib.proxy.Enhancer;   import  net.sf.cglib.proxy.MethodProxy;   import  methodinterceptor能够;/* *   ,* VM 参数:,- xx: PermSize=10 m  - xx: MaxPermSize=10米   ,*/public  class  MethodAreaOOM  {      public 才能;static  void  main (String [], args), {   ,,,int  count =, 0;   ,,,while (真实),{   ,,,,,Enhancer  Enhancer =, new 增强剂();   ,,,,,enhancer.setSuperclass (MethodAreaOOM.class);   ,,,,,enhancer.setUseCache(假);   ,,,,,enhancer.setCallback (new  MethodInterceptor (), {   ,,,,,,,public  Object 拦截(Object  obj, Method 方法,对象[],参数,,MethodProxy 代理),throws  Throwable  {   ,,,,,,,,,return  proxy.invoke (obj, args);   ,,,,,,,}   ,,,,,});   ,,,,,enhancer.create ();   ,,,,,System.out.println(+ +数);   ,,,}   ,,}      }

- xx: MaxPermSize为10 m。其中的一次测试结果为,当计数的值累加到800时,发生如下异常:

代码如下:

所致:. lang。OutOfMemoryError: PermGen空间java.lang.ClassLoader.defineClass1(本机方法)java.lang.ClassLoader.defineClass (ClassLoader.java: 792)…8多

Java出现内存溢出的原因是什么

Copyright © 2020-2023 feiqueyun.cn. All Rights Reserved. 肥雀云_南京肥雀信息技术有限公司版权所有 南京肥雀信息技术有限公司 苏ICP备16063723号-5