簡體   English   中英

如何跟蹤Java應用程序中已使用的內存?

[英]How to keep track of the used memory in a Java application?

我有一個Java應用程序,它廣泛使用內存。 它保持了非常快速增長的數據結構,並負責使用最大數量的內存。

為了避免內存不足,我決定將數據結構刷新到存儲庫(文件或db)並對其進行后處理。

我面臨的問題是選擇時間(將已用內存“關閉”以達到允許的最大值)以將數據結構刷新到存儲庫中。 一種方法是在每次更新時跟蹤數據結構的內存使用情況。

         dataStructure.onUpdate(new CheckMemoryIfReachedMax() {
               public void onUpdate(long usedMemory) {
                    if (usedMemory == MaxMemory) {
                        datastucture.flushInRepository();
                    }
               } 
         }

在這種情況下的主要問題是更改數據結構以跟蹤內存並不容易。

另一種可能的解決方案是從JVM獲取使用的內存,並將其與最大內存進行比較。

          Runtime runtime = Runtime.getRuntime();
          long freeMemory = runtime.freeMemory();
          if (freeMemory < MaxUsedMemory) {
              datastucture.flushInRepository();
          }

在這種情況下,問題在於內存使用情況僅提示使用了多少內存,因為我們無法預測垃圾收集器刪除對象的時間。 該解決方案使我更經常將數據結構刷新到存儲庫,因此應用程序性能可能因此受到影響。

在這些情況下,是否使用任何通用模式? 您對哪種解決方案更適合該問題有任何建議嗎?

我認為您應該使用第一種方法,因為比較運行時內存取決於很多事情。 因此,對於使用第一種方法並通過對象獲取usedMemory,您可以使用

long getObjectSize(Object objectToSize)

從Instrumentation Interface中獲取對象的近似大小。

請參閱http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize(java.lang.Object)

沒有“ JVM使用的內存”的通用定義,最好的選擇是自己跟蹤結構的大小,抱歉。

問題是-JVM將內存用於垃圾數據和實際數據,並且在發生實際垃圾收集之前,無法將它們彼此區分開 這是設計使然,實際上是一項重大優化。

一個骯臟的解決方法是使用JMX跟蹤上一次收集期間釋放的內存量(這將是短期垃圾的大小)。 這有兩個缺點:

  • 一旦長期存在的垃圾堆積起來,您將得到誤報;
  • 您將取決於特定的垃圾收集器和垃圾收集器設置(例如,我不知道該方案是否可以通過G1實現)。

暫無
暫無

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

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