检查 Java 元空间区域的内容

【检查 Java 元空间区域的内容】

检查 Java 元空间区域的内容

文章插图

JVM 内存有以下区域:
 
  1. Young Generation
  2. Old Generation
  3. Metaspace
  4. Others region
 
检查 Java 元空间区域的内容

文章插图
图:JVM 内存区域
要查看哪些对象存储在哪个区域,您可以参考此视频剪辑 。有时您的应用程序可能会遇到本文中讨论的 ' JAVA.lang.OutOfMemoryError: Metaspace' 。在这种情况下,您可能希望查看 JVM 的 Metaspace 区域中加载了哪些内容 。简而言之,JVM 内存中的 Metaspace 区域包含执行应用程序所需的类元数据定义 。如果想了解类元数据定义是什么意思,可以参考这个文档. 它有很多细节,你可能不必了解它的所有细节 。基本上,如果您能够了解加载到内存中的类是什么,那么它将很好地了解 JVM 内存的 Metaspace 区域中存在哪些内容 。在这篇文章中,让我们探索可用于查看加载到元空间中的类的选项 。
以下是查看元空间中加载的类的选项:
-verbose:class
-Xlog:class+load
jcmd GC.class_histogram
Programmatic Approach
Heap Dump analysis
让我们在这篇文章中详细讨论每个选项 。
1. -Verbose: Class
如果您在 Java 版本 8 或更低版本上运行,则可以使用此选项 。当您在启动期间将“ -verbose:class”选项传递给您的应用程序时,它将打印所有加载到内存中的类 。加载的类将打印在标准错误流中(即控制台,如果您没有将错误流路由到日志文件) 。
java {app_name} -verbose :class
以下是传递“-verbose:class”参数时开源BuggyApp 程序的示例输出:
[Opened C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.Object from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.io.Serializable from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.Comparable from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.CharSequence from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.String from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.reflect.AnnotatedElement from C:Program
FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.reflect.GenericDeclaration from C:Program
FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.reflect.Type from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.Class from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.Cloneable from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.ClassLoader from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.System from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.Throwable from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.Error from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.ThreadDeath from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.Exception from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.RuntimeException from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.SecurityManager from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.security.ProtectionDomain from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.security.AccessControlContext from C:Program
FilesJavajre1.8.0_171librt.jar]
[Loaded java.security.SecureClassLoader from C:Program
FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.ReflectiveOperationException from C:Program
FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.ClassNotFoundException from C:Program
FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.LinkageError from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.NoClassDefFoundError from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.ClassCastException from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.ArrayStoreException from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.VirtualmachineError from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.OutOfMemoryError from C:Program FilesJavajre1.8.0_171librt.jar]
[Loaded java.lang.StackOverflowError from C:Program FilesJavajre1.8.0_171librt.jar]
2.-Xlog:类+加载
如果您在 Java 版本 9 或更高版本上运行,则可以使用此选项 。当您在启动期间将“-Xlog:class+load”选项传递给您的应用程序时,它将打印所有加载到内存中的类 。加载的类将打印在您配置的文件路径中 。
java {app_name} -Xlog:class+load=info:/opt/log/loadedClasses.txt以下是传递“-Xlog:class+load”参数时 java 程序的示例输出:


推荐阅读