簡體   English   中英

JVM的內存占用量是多少?如何最小化它?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM