当前位置 博文首页 > 精通时间管理:学妹问我:我遇到了OutOfMemoryError异常怎么办?
除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM)异常的可能
java堆溢出
堆在动态扩展的时候,超过最大值-Xmx参数,就会触发OutOfMemoryError异常
堆的最小值-Xms参数与最大值-Xmx设置的参数 设置为一样即可避免堆自动扩展
while (true) {
list.add(new OOMObject());
}
虚拟机栈和本地方法栈溢出
在热点虚拟机中,因为上述两个栈不能动态扩展,所以没有OutOfMemoryError错误,会出现StackOver-flowError
方法区溢出(因为常量池太大
方法区里存的类的元数据,包括以下内容:
1:类的全限定名(类的全路径名)
2:类的直接超类的全限定名(如果这个类是Object,则它没有超类)
3:这个类是类型(类)还是接口
4:类的访问修饰符,如public、abstract、final等
5:所有的直接接口全限定名的有序列表(假如它实现了多个接口)
6:常量池、字段、方法信息、类变量信息(静态变量) 装载该类的装载器的引 用(classLoader)、类型引用(class)
因为方法区存的东西只可能是常量池太大导致内存溢出,其他存的东西都基本是有限的
NIO—直接内存
cs直接内存+其他内存总和大于本机内存时溢出