小编给大家分享一下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
然后在运行时设置jvm参数,如下:
- 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出现内存溢出的原因是什么