为什么Java 8中的类元空间会随着时间的推移而增加?

时间:2016-02-13 13:06:38

标签: hibernate tomcat jvm metaspace

我正在运行Tomcat应用程序(由Hibernate + EhCache组成)。典型的ORM webapp不应该创建很多类。但是,Native Memory Tracking说" Nay"。

在过去24小时内,我的网络平台在Metaspace平均每小时创建约1个新课程,每小时最多11个课程,4个小时没有创建课程。

所以,我从7449课开始,24小时后我有7481课。 在引入完整的GC之后,类的数量可以减少0-2,但总体上保持不变。

所以

  1. 如果懒惰地加载类,我如何估计在本机内存中创建的类的总数?

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

  3. 我的配置:

    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
    

1 个答案:

答案 0 :(得分:2)

  

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

一般来说,没有。理论上的应用程序可以随时发出类文件字节码。

  

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

你做不到。延迟类加载是Java功能之一。好吧,您可以扫描类路径并加载所有JAR中的所有类,但这不是您想要做的,因为它最终会有数千个从未使用过的类。

  

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

使用-XX:+TraceClassLoading