[英]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中獲取對象的近似大小。
沒有“ JVM使用的內存”的通用定義,最好的選擇是自己跟蹤結構的大小,抱歉。
問題是-JVM將內存用於垃圾數據和實際數據,並且在發生實際垃圾收集之前,無法將它們彼此區分開 。 這是設計使然,實際上是一項重大優化。
一個骯臟的解決方法是使用JMX跟蹤上一次收集期間釋放的內存量(這將是短期垃圾的大小)。 這有兩個缺點:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.