[英]What is the memory footprint of the JVM and how can I minimize it?
我只是想知道當一個人開始產生JVM的多個進程時,JavaVM(Sun,Linux)的實際占用空間是什么。 當我記得那些應該分享rt.jar(也許超越?)。 那些JVM是否共享JIT緩存(所有JVM功能都是相同的Classpath)?
有什么辦法可以減少多實例JVM的開銷嗎? (除了設置較小的堆限制)?
編程應用程序時我能做些什么?
我可以共享內存區域嗎? 也許共享映射的內存塊?
這篇文章描述了構成Java應用程序足跡的原因。 也就是說,如果您想減少占用空間,則需要減少這些部分:Java堆,元數據空間,代碼緩存,直接緩沖區,線程數等。
HotSpot JVM的實例不會相互通信以共享數據。 基本上它們除了操作系統共享的東西之外什么也沒有共享,即動態庫(.so)和只讀內存映射文件(.jars)。
應用程序通過IPC機制提供進一步的共享,例如內存映射文件。
可能它只是一個部分答案。
JVM的內存占用量是多少?
Java應用程序的完整足跡包括堆空間和非堆空間(讓我這樣稱呼它)。 只是幾個非堆空間內的例子:PermGen或Metaspace,從代碼(malloc)中直接分配,NIO也使用本機記憶。
我該如何最小化它?
堆通常占據您足跡的最大部分。 所以,我會從它開始。
對於非堆空間,您可以最小化:PermGen(如果最大大小是冗余的),線程堆棧(它們非常大,特別是在64位JMM中)和代碼緩存(當然是性能)。
這些JVM是否共享JIT緩存
在正常情況下(我不了解其他情況),每個流程都有自己的足跡。 這實際上是一個與線程不同的進程。 回到多個JVM,每個JVM都是一個獨立的進程。
應該分享rt.jar
如果從同一目錄(相同的安裝)啟動Java,當然,它們共享相同的rt.jar,但僅作為類的源。 例如,String類將與許多正在運行的JVM一樣多次加載。
為了補充其他答案,這里有幾篇富有洞察力的文章列出了典型的JVM內存占用值及其測量方法:
https://spring.io/blog/2015/12/10/spring-boot-memory-performance
http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-java/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.