2016-02-13 66 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

相關問題