概念
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虚拟机能提供的内存大小。
JVM内存模型
这部分内容来自我的上一篇文章:[JVM|内存模型] Java虚拟机的内存模型?也就这7个而已
Java虚拟机所管理的内存包括以下 7个 运行时数据区域:
程序计数器 (Program Counter Register)
一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器
线程私有的内存
值得注意的是:《Java虚拟机规范》中,唯一一个没有规定任何OutOfMemoryError情况的区域!!!
Java虚拟机栈 (VM Stack)
Java方法执行的线程内存模型
为虚拟机执行Java方法(也就是字节码)服务
线程私有的内存
其生命周期与线程相同
每个Java方法的执行对应