深入理解java虚拟机——OutOfMemoryError异常

1. Java堆溢出

解决方案:通过内存映像分析工具(如 Eclipse Memory Analyzer)对堆转储快照进行分析,确定时内存泄漏还是内存溢出。

如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。于是就能找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收它们。掌握了泄露对象的类型信息及GC Roots引用链信息,就可以比较准确地定位出泄漏代码的位置。
如果不存在泄漏(内存中的对象确实都还活着),就应当检查虚拟机的堆参数,与机器物理内存对比看是否还可以调大,从代码上检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存消耗。

2. 虚拟机栈和本地方法栈溢出

如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出 StackOverflowError 异常。
如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出 OutOfMemoryError异常。

在多线程导致内存溢出的情况下,栈空间是否足够大并没有直接的关联。在不能减少线程数或者更换64位虚拟机情况下,可以通过减少最大堆和减少栈容量来换取更多的线程。

3.方法区和运行时常量池溢出

String.intern()是一个Native方法。作用:如果字符串常量池中已经包含了一个等于此String对象的字符串,则返回代表池中的这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并返回此String对象的引用。

    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/ice__cookie/article/details/79052033
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞