混沌工程:Metaspace的OutOfMemoryError

525 阅读2分钟

混沌工程:Metaspace的OutOfMemoryError

在这里,模拟遇到'java.lang.OutOfMemoryError。这表明JVM内存中的Metaspace区域已经饱和了。

JVM内存有以下几个区域。

JVM内存区域

  1. 年轻一代
  2. 老一代
  3. 元空间
  4. 其他区域

当你遇到'java.lang.OutOfMemoryError:Metaspace",这表明JVM内存中的Metaspace区域正在饱和。Metaspace是存储执行应用程序所需的元数据细节的区域。简而言之,它们包含你的应用程序的类定义和方法定义。要了解更多关于每个JVM内存区域中存储的内容,你可以参考"JVM内存--轻松学习 "视频。在这篇文章中,让我们讨论如何模拟java.lang.OutOfMemoryError。Metaspace。

模拟 java.lang.OutOfMemoryError:元空间

为了模拟 "java.lang.OutOfMemoryError:Metaspace',我们写了这个程序:

public class MetaspaceLeakProgram {      

这个程序利用了开源的Javassist库中ClassPool 对象。这个ClassPool 对象能够在运行时创建新的类。请仔细看一下上面的程序。如果你注意到,这个程序一直在创建新的类。下面是这个程序生成的类名样本:

com.buggyapp.MetaspaceObject76a9a309-c9c6-4e5f-a302-8340eb3acdef 

每当一个新的类被创建,它相应的类元数据定义就会在JVM的Metaspace区域被创建。由于元数据定义是在Metaspace中创建的,它的大小开始增长。当达到最大的元空间大小时,应用程序将遇到'java.lang.OutOfMemoryError:Metaspace'。

java.lang.OutOfMemoryError:Metaspace的原因

java.lang.OutOfMemoryError:Metaspace'错误发生的原因有两个:

  1. Metaspace区域大小分配不足
  2. Metaspace区域的内存泄漏

你可以通过增加Metaspace区域的大小来解决原因#1。你可以通过传递JVM参数-XX:MaxMetaspaceSize来做到这一点。

为了解决原因#2,你必须做适当的故障排除。请进一步阅读如何排除Metaspace区域的内存泄漏问题