2016-02-13 90 views
1

我正在运行Tomcat应用程序(它由Hibernate + EhCache组成)。这是典型的ORM webapp,不应该创建大量的类。但是,Native Memory Tracking说“不”。为什么class 8 metaspace在Java 8中随时间增加?

在过去24小时内,我的webapp平均每小时在Metaspace创建约1个新课程,每小时创建11个课时,并且高峰4个小时,而不创建课程。

所以,我开始了7449课,24小时后我有7481课。 诱导完全GC后,类数可以减少0-2,但总体保持不变。

所以

  1. 如果类被延迟加载的,我怎么能估计的类的总数在本机内存中创建?

    • 我知道Hibernate创建代理类。有没有办法预测这些代理类的数量?
    • 如何强制JVM急切地加载所有类?
  2. 我该如何记录哪些新类加载到Metaspace?

我的配置:

Server version: Apache Tomcat/8.0.28 
OS Name:  Linux 
OS Version:  3.14.34-27.48.amzn1.x86_64 
Architecture: amd64 
JVM Version: 1.8.0_71-b15 
JVM Vendor:  Oracle Corporation 

JVM flags: -Xms512m -Xmx2G -XX:+UseG1GC -XX:NativeMemoryTracking=summary -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics 
Hibernate 4.3.1 

回答

2

有没有预测这些代理类计数

在一般情况下,没有办法。理论上的应用程序可以随时发出类文件字节码。

如何强制JVM加载所有类热切?

你不行。惰性类加载是Java特性之一。那么,您可以扫描类路径并加载所有JAR中的所有类,但这不是您想要做的,因为它最终会导致数千个未使用的类。

如何记录哪些新类加载到Metaspace?

使用-XX:+TraceClassLoading