OOM

java.lang.OutOfMemoryError

要解决 OOM 异常或者 heap space 异常,一般首先通过 Eclipse Memory Analyzer内存映像分析工具dump出来的堆转储快照 进行分析.重点是确认内存中的对象是否是必要的,也就是要先分清到底是 memory leak内存泄漏还是 memory overflow内存溢出

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