JVM使用的內存不僅僅是堆。例如,Java方法、線程堆棧和本機句柄在內存中與堆以及JVM內部數據結構分開分配。若想要更加系統更加詳細的學習 JVM 知識,建議參加java培訓,有經驗豐富的專業講師面授指導教學,能夠幫你更全面了解JVM。
-Xmx參數的值控制Java堆的最大大小,Java堆不是JVM分配的唯一內存。除了永久性生成或Metaspace(基于java,從JDK 8起,Meta Space就在那里),CodeCache,其他JVM內部使用的本機C++堆,線程堆棧的空間,直接字節緩沖區,GC開銷,以及JVM內存消耗中包含的其他東西。
以下是一些其他JVM內存組件:
Metaspace(元空間)
JDK 8之前的HotSpot JVM有第三種類型的生成,稱為永久生成,它與Java堆相鄰。它包含JVM用來描述應用程序中使用的類和方法的元數據。從JDK 8開始,Permanent被一個稱為Metaspace的新空間所取代,該空間與Java堆不相鄰。Metaspace是從本機內存中分配的。MaxMetaspaceSize參數限制JVM中Metaspace的使用。默認情況下,Metaspace沒有限制,它以非常小的默認值開始,并根據需要以較小的增量增長。Metaspace只包含類元數據,所有活動Java對象部分都被移動到堆內存中,因此Metaspace的使用率遠低于永久生成。通常,無需指定最大Metaspace大小,除非面臨較大的Metaspace泄漏。在java培訓中,也有關于JVM內存的學習,學好這部分的知識,可以避免在工作中出現的很多問題。
CodeCache
CodeCache是包含JVM生成的本機代碼的內存區域。JVM生成本機代碼的原因有很多。這些原因包括動態生成的解釋器循環、JNI存根和由JIT編譯器編譯成本機代碼的Java方法。JIT編譯器貢獻了大部分代碼緩存區域。
ThreadStackSize/Xss
-XX:ThreadStackSize=size設置線程堆棧大小(以字節為單位)。附加字母k或K表示千字節,m或M表示兆字節,或g或G表示千兆字節。Xss的默認值取決于您運行的操作系統和體系結構。此選項相當于-Xss。
JVM一向很好的幫我們管理內存,它是Java程序運行的環境,同時是一個操作系統的一個應用程序進程,因此它有自己的生命周期,也有自己的代碼和數據空間。參加java培訓學習,可以在短時間內獲得很大提升,避免在學習上多走彎路,節省時間,提高學習效率。