簡體   English   中英

java.exe進程使用更多內存而不釋放它

[英]java.exe process uses more memory and does not free it up

我有一個java應用程序,在任何復雜執行之前處於空閑狀態時,在Heap中使用23 MB並且TaskManager中的java.exe進程大小約為194 MB。 經過一些復雜的操作后,java.exe的大小增長到大約500MB,堆大小也增長了。 通過調用System.gc()方法,在幾個完整的GC之后,堆大小減少到23MB。 但java.exe的大小從大約600MB減少到大約237MB,其中仍有大約43 MB的數據。 有沒有辦法減少這個? 或者是由於某些行為?

這很正常,不用擔心。 JVM在需要執行某些復雜邏輯時獲取內存。 當java完成處理任務時,JVM仍將該內存保留為保留空間,並且不會釋放回操作系統。 此體系結構有助於提高性能,因為JMV不必再從底層操作系統請求相同的內存。 它仍然在您在-Xmx JVM參數中定義的范圍內。

有關一些有趣的細節,請參閱此IBM鏈接。 http://www-01.ibm.com/support/docview.wss?uid=swg21326774

不幸的是,這是JVM的一個灰色區域; 你真的沒有太多關於OS和JVM如何在彼此之間共享內存的控制。 將JVM視為需要運行某些內存的虛擬操作系統。 您的父操作系統和虛擬機都渴望獲得資源,並且希望盡可能多地將所獲得的資源掛在所獲取的資源上。 從操作系統請求更多內存是一項耗時的操作,因此大多數JVM都不會將內存釋放回操作系統,即使它們不再需要它也是如此。

有關內部JVM內存管理的更多詳細信息,請參閱Oracle的此白皮書。 http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf

我建議你先閱讀IBM鏈接,然后你可以深入研究白皮書中解釋的奇怪的內存世界。 這兩個鏈接都非常豐富和有趣。

Java進程的OS足跡由

  • java堆(它的大小受-Xmx限制)
  • java類相關元數據(或HotSpot JVM中的永久生成)
  • 通過NIO可訪問的非堆內存
  • 用於java線程的堆棧空間

一些垃圾收集算法將可用內存返回給OS,其他則沒有。 在HotSpot JVM中,串行舊空間收集器(通常默認啟用)將內存返回到OS(因此您可以看到進程收縮)。 但是,其他收集器如-XX:+UseParallelOldGC-XX:+UseConcMarkSweepGC將永遠不會將未使用的堆內存返回給OS。

HotSpot JVM具有管理/限制上述所有內存區域的選項,您可以在我的博客中找到與內存大小調整和GC調整相關的JVM選項的完整列表。

暫無
暫無

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

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