簡體   English   中英

如何在Java中僅獲得可用堆大小(而不是堆棧與方法內存一起)?

[英]How to get just free heap size (not together w stack/method mem) in Java?

我想計算應用程序的堆使用情況。 我想得到堆大小的procent值。

如何獲得當前正在運行的應用程序的代碼中的值?

編輯

有人提出不正確/不正確的答案。 這些方法返回的值也包括堆棧和方法區域,我只需要監視堆大小。
使用該代碼,當我達到43%時,我得到了HeapError異常,因此我不能使用這些方法來監視堆

Runtime.getRuntime().totalMemory()

dbyme的答案不准確-這些Runtime調用給您提供了JVM使用的內存量,但是該內存不僅包含堆 ,還包含堆棧和方法區域,例如

此信息通過JMX管理界面公開。 如果只想看一下,JConsole或visualvm(安裝在JAVA_HOME / bin中的JDK的一部分)可以顯示JVM內存使用情況的漂亮圖表,可以選擇細分為各種內存池。

該接口也可以通過編程方式訪問; 參見MemoryMXBean

MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); bean.getHeapMemoryUsage()。getUsed();

確實沒有很好的答案,因為JVM擁有多少可用的堆內存與操作系統有多少可用的堆內存並不相同,這兩者都不等於可以為您的應用程序分配多少堆內存。

這是因為JVM和OS堆不同。 當JVM內存不足時,它可能會運行垃圾回收,對自己的堆進行碎片整理或從OS請求更多內存。 由於未使用的非垃圾收集對象仍然存在,但從技術上講是“免費的”,因此它們使“免費存儲”的概念有些模糊。

同樣,堆內存碎片; 如何/何時/是否對內存進行碎片整理取決於JVM / OS的實現。 例如,OS堆可能有100MB的可用內存,但是由於碎片,最大的可用連續空間可能是2MB。 因此,如果JVM請求3MB,即使100MB仍然可用,它也可能會出現內存不足錯誤。 JVM不可能提前知道操作系統將無法分配該3MB。

暫無
暫無

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

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