2

我正在运行 Tomcat 应用程序(由 Hibernate + EhCache 组成)。它是典型的 ORM webapp,不应该创建很多类。但是,本机内存跟踪说“不”。

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

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

所以

  1. 如果类是延迟加载的,我如何估计要在本机内存中创建的类的总数?

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

我的配置:

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
4

1 回答 1

2

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

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

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

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

如何记录哪些新类加载到元空间?

利用-XX:+TraceClassLoading

于 2016-02-19T08:21:21.003 回答