课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存溢出问题对于新手程序员来说是学习编程开发技术的时候需要重点关注的问题之一,而今天我们就通过案例分析来了解一下,java编程内存溢出的常见类型。
1、Java堆OutOfMemoryError
Java堆是用来存储对象实例的,因此如果我们不断地创建对象,并且保证GCRoot和创建的对象之间有可达路径以免对象被垃圾回收,那么当创建的对象过多时,会导致heap内存不足,进而引发OutOfMemoryError异常.
2、Java栈StackOverflowError
我们知道,JVM的运行时数据区中有一个叫做虚拟机栈的内存区域,此区域的作用是:每个方法在执行时都会创建一个栈帧,用于存储局部变量表,操作数栈,方法出口等信息.
因此我们可以创建一个无限递归的递归调用,当递归深度过大时,就会耗尽栈空间,进而导致了StackOverflowError异常.
3、运行时常量池溢出
在Java1.6以及之前的HotSpotJVM版本时,有永久代的概念,即GC的分代收集机制是扩展至方法区的.在方法区中,有一部分内存是用于存储常量池,因此如果代码中常量过多时,就会耗尽常量池内存,进而导致内存溢出.那么如何添加大量的常量到常量池呢?这时就需要依靠String.intern()方法了.String.intern()方法的作用是:若此String的值在常量池中已存在,则这个方法返回常量池中对应字符串的引用;反之将此String所包含的值添加到常量池中,并返回此String对象的引用.在JDK1.6以及之前的版本中,常量池分配在永久代中,因此我们可以通过设置参数“-XX:PermSize”和“-XX:MaxPermSize”来间接限制常量池的大小。
4、方法区的内存溢出
方法区作用是存放Class的相关信息,例如类名,类访问修饰符,字段描述,方法描述等.因此如果方法区过小,而加载的类过多,就会造成方法区的内存溢出。
5、MetaSpace内存溢出
在方法区的内存溢出内存溢出一节中,我们提到,JDK8没有了永久代的概念,因此那两个例子在JDK8下没有实现预期的效果.那么在JDK8下,是否有类似方法区内存溢出之类的错误呢?当然有的.在JDK8中,使用了MetaSpace的区域来存放Class的相关信息,因此当MetaSpace内存空间不足时,会抛出java.lang.OutOfMemoryError:Metaspace异常。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!