Java堆溢出
现象
- java.lang.OutOfMemoryError: Java heap space
原因
- 大量对象没有释放,无法回收
解决方案
- 使用内存映像分析工具分析 Dump 出来的堆转储快照,分析对象是是否合理存在,可以排查是内存泄露还是溢出
- 如果内存泄露,工具查看泄漏对象到 GC Root 的引用链,定位出泄漏的位置;
- 如果不存在泄漏,检查虚拟机堆参数(-Xmx 和 -Xms)是否可以调大
配置
- 配置 -XX:HeapDumpOnOutOfMemoryError,在发生内存溢出会存储快照用于事后分析
Java 虚拟机栈和本地方法栈溢出
原因
- 单线程下,栈帧过大或内存过小,都不会导致OutOfMemoryError,只会导致StackOverflowError(栈会比内存先出问题)
- 多线程情况下会导致OutOfMemoryError,因为多个线程本身要占用内存
解决方案(多线程情况)
- 更换64位虚拟机
- 减少最大堆和栈容量换取更多的线程
直接内存溢出
现象
- Heap Dump 文件中看不见明显异常,程序中直接或间接用了 NIO
解决方案
- 提高直接内存大小 -XX:MaxDirectMemorySize,没有没有指定默认和-Xmx一致
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17897.html