Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError
一、OutOfMemoryError 和 StackOverflowError
1️⃣堆区域用来存放 Class 的实例(即对象),对象需要存储的内容主要是非静态属性。每次用 new 创建一个对象实例后,对象实例存储在堆区域中,这部分空间也被 JVM 的垃圾回收机制管理。
【Java 堆内存溢出】java.lang.OutOfMemoryError:java heap space最常见,一般由于内存泄露或者堆的大小设置不当引起。原因是 JVM 创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与 Heap space 有关。解决这类问题有两种思路:
2️⃣Java 栈跟大多数编程语言包括汇编语言的栈功能相似,主要基本类型变量以及方法的输入输出参数。
【Java 栈内存溢出】java.lang.StackOverflowError也比较常见。Java 栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。
二、Java 运行时数据区(Runtime Data Area)
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,即运行时数据区(Runtime Data Area):
三、常见场景
1️⃣静态集合类声明为静态static的HashMap、Vector 等集合。通俗来讲A中有B,当前只把B设置为空,A没有设置为空,回收时B无法被回收,因为被A引用。
2️⃣物理连接:DataSource.getConnection()建立链接,必须通过close()关闭链接。
3️⃣内部类和外部模块等的引用
GC只会回收没有被引用或者根集不可到达的对象(取决于 GC 算法),内部类在生命周期内始终持有外部类的对象的引用,造成外部类的对象始终不满足 GC 的回收条件,反映在内存上就是内存泄露。常见解决方案:
4️⃣【OutOfMemoryError:unable to create new native thread】Executors 返回的线程池对象的弊端如下:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
四、分析定位
1️⃣在未明确找到问题原因前,先添配置 JVM 启动参数,监控复原 OOM 场景自动dump:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录}
2️⃣
总结
以上是生活随笔为你收集整理的Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 禁用windows10更新_如何在Win
- 下一篇: Java中的CAS操作