网易互娱一面:什么是OOM?为什么会出现OOM?怎么解决?

404 阅读1分钟

发布于个人公众号,打开微信,搜索MelodyJerry即可

网易互娱提前批一面时候,面试官问的这个问题,现回过头简单记录下。

OOM?为什么会出现?

概念

  • OOM,全称“Out Of Memory”,意思是“内存用完了”

  • 来源于 java.lang.OutOfMemoryError

  • 这是个特别严重的问题,因为这个问题已经 严重到应用程序自己无法处理了。

原因

官方的文档称,当JVM因为没有足够的内存为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出 java.lang.OutOfMemoryError: ···

具体原因一般有这两个:

自身原因

  • 分配的内存少了,比如JVM虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
    • -XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m -XX:HeapDumpPath=D:\oomTemp
    • -XX:+HeapDumpOnOutOfMemoryError:表示 导出内存溢出的堆信息(hprof文件)
    • -Xms:表示 设定程序启动时占用内存大小
    • -Xmx:表示 程序运行期间最大可占用的内存大小
    • -XX:HeapDumpPath=:表示 生成得快照路径

外部原因

  • 内存被应用程序使用的太多,而且用完后没有释放,浪费了内存。这种情况下会造成内存泄漏or内存溢出
    • 内存泄漏:应用进程申请并使用完的内存,没有被释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为当前的申请者不用了,但又不能被JVM虚拟机分配给其他申请者。
    • 内存溢出:申请的内存超出了JVM虚拟机能提供的内存大小。