其他分享
首页 > 其他分享> > OutOfMemoryError异常总结

OutOfMemoryError异常总结

作者:互联网

JVM内存区域中,除了程序计数器外,其他几个运行时区域都有可能发生OutOfMemoryError(OOM)异常

(1)堆溢出

原因:Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,对象数量达到最大堆容量限制,则发生溢出。

解决:要解决这个区域的异常,一般是先使用内存分析工具(IDEA中的JProfiler插件),对Dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是有必要的,也就是确认到底是“内存泄漏”还是“内存溢出”

如果是内存泄漏,就用上述插件进一步找到泄露对象到GC Roots的引用连,于是就能知道泄露对象是通过怎样的路径与GC Roots相关联,并导致垃圾回收器GC无法自动回收它们的,也就准确的定位出泄露代码的位置。

如果不存在泄露,换就话说,就是内存中的对象确实都还必须存活,一方面:检查虚拟机的堆参数,将堆参数与计算机物理内存对比一下,看看是否还可以把堆参数调大一点。另一方面:从代码上检查看看是否有哪些对象的生命周期过长,以尝试减少程序运行期的内存消耗。

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

多线程下的内存溢出,与栈空间是否足够大并不存在任何联系。为每个线程的栈分配的内存越大(参数-Xss),那么可以建立的线程数量就越少,建立线程时就越容易把剩下的内存耗尽,越容易内存溢出。在这种情况下,如果不能减少线程数目或者更换64位虚拟机时,减少最大堆和减少栈容量能够换区更多的线程

标签:总结,对象,虚拟机,线程,内存,OutOfMemoryError,GC,异常,溢出
来源: https://www.cnblogs.com/tingtin/p/15913308.html