簡體   English   中英

Java 8分配了太多內存

[英]Java 8 allocating too much memory

我正在使用Java 7 JRE運行Eclipse 4.3 當我升級到Java 8 JRE ,Eclipse會突然消耗更多內存。 如果我將帶有JRE 7 Eclipse直接啟動到我的工作區,它會根據任務管理器分配600 MB的RAM。 當我使用JRE 8 ,此值為750 MB。

更糟糕的是,如果我運行一個大型Java程序,通常使用JRE 7分配大約10 GB的RAM,切換到JRE 8會導致它分配12 GB的RAM。

有人知道是什么原因導致額外的RAM分配嗎? 我已經測試了調整不同的選項,但沒有成功:

-XX:ReservedCodeCacheSize=
-XX:MaxMetaspaceSize=
-XX:MetaspaceSize=
...

在提出問題的方式

為什么Java 8在我的機器上分配太多內存

我認為任何人都無法回答,但有幾條指南可能有所幫助。 鑒於您通過任務管理器測量內存,您對使用的RSS總量感興趣。 所以

  • 步驟1:比較正在運行的版本之間的JVM默認值。 您可以使用java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version命令為兩個jdks獲取它們。 在輸出之上使用文本排序,您將能夠使用任何比較工具獲得一個不錯的差異。 更改默認GC收集器和線程堆棧大小之類的事情將影響最終的RSS。
  • 第2步:測量每個內存池的分配。 通常,java使用的總內存可以使用heap + metasize + code cache + native + (thread_stack_size * maximum_number_of_threads)
    • 通過成熟的工具( Eclipse Memory AnalyzerVisualVM等)可以輕松測量堆內存(並且可以輕松比較!!)。 如果你的內存增加了堆積區域 - 你很幸運。 在附加的visual vm中,允許您安裝插件,該插件將顯示可通過jmx訪問的所有內存池的值。
    • metasize(在jdk <8中稱為permgen)應該更多/更少相等,並且可以使用jmap工具找到。 不需要玩旗幟,你可以得到數字,只要比較增加與否。
    • 代碼緩存 :除了保留代碼緩存之外,您還可以設置初始代碼緩存(這會影響使用多少RSS)。
    • 本地人:這是一只黑羊。 如果所有其他內存池相等(內存大小為2GB),則內存丟失必須位於本機區域的某處。 我所知道的唯一工具是jcmd ,它在oracle文檔中有大量文檔。

非技術性的 - 雖然調整各種選項以減少記憶可能有所幫助,但獲得正確值的機會接近於在大海撈針中找到針。 我真的建議了解如何在java中使用RSS。 這些知識將在未來幾年內得到應用!

如果您想要更具體的參考資料或更好的解釋,請隨時告訴我。 而且...祝你好運!-)

我可以確認我正在使用的Web應用程序(Jetty,Struts2,JDBC)在JRE 1.8.0_72中運行后,在啟動后立即消耗大約300 MB的RAM(1.2G),而JRE為1.7.0_80。 該應用程序在Centos 6 x64上運行,並使內存測量盡可能透明,我已禁用交換和設置-Xms等於-Xmx(可用RAM的40%)。 我使用dstat --top-memtop -m來獲取java進程消耗的總內存。

此外,當Web客戶端過於頻繁地連接到應用程序時,消耗的總內存會上升,直到系統內存不足並導致Java進程終止。 我唯一能看到的是/ var / log / messages中的信息:

11月10日21:29:54我的內核:內存不足:殺死進程26610(java)得分570或犧牲孩子

當我從bash運行一個無限循環,調用連接到應用程序的4個並行Web客戶端(=建立新的TCP連接)時,請求應用程序狀態並斷開連接,然后應用程序消耗的總內存每分鍾上升大約100-200 KB。 每個客戶端每分鍾執行6-10個請求。 使用的堆內存大小穩定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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