CH11-JVM-OOM
堆内存溢出
在 Java 堆中只要不断的创建对象,并且
GC-Roots
到对象之间存在引用链,这样JVM
就不会回收对象。只要将
-Xms(最小堆)
,-Xmx(最大堆)
设置为一样禁止自动扩展堆内存。当使用一个
while(true)
循环来不断创建对象就会发生OutOfMemory
,还可以使用-XX:+HeapDumpOutofMemoryErorr
当发生 OOM 时会自动 dump 堆栈到文件中。当出现 OOM 时可以通过工具(如 JProfiler)来分析
GC-Roots
,查看对象和GC-Roots
是如何进行关联的,是否存在对象的生命周期过长,或者是这些对象确实改存在的,那就要考虑将堆内存调大了。
元空间溢出
JDK8
中将永久代移除,使用MetaSpace
来保存类加载之后的类信息,字符串常量池也被移动到 Java 堆。
- JDK 8 中将类信息移到到了本地堆内存(Native Heap)中,将原有的永久代移动到了本地堆中成为
MetaSpace
,如果不指定该区域的大小,JVM 将会动态的调整。 - 可以使用
-XX:MaxMetaspaceSize=10M
来限制最大元数据。这样当不停的创建类时将会占满该区域并出现OOM
。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.