2017-05-04 36 views
0

我嘗試刪除管理內存堆的對象。刪除管理java內存堆的對象

但是,它不工作。

我有緩存數據(圖像數據)。 父類是具有許多圖像數據的客戶端(類名)。 客戶端(客戶端類具有學習班名單)>>學習(學習班具有系列班名單)>>系列(系列班具有圖像班名單)>>圖像(圖像班具有圖像數據)。

我試圖某種方式(下面)

  1. 用於管理存儲器堆我除去最好父類對象。 前)客戶端:studyList.remove(鍵) - >不行

  2. 我刪除圖像數據,所有列表 前)客戶端:studyList.remove(鍵)+ seriesList.remove(鍵)+圖象 - = NULL - >不工作;

活動監視器(的MacBook)示出了Java內存堆不是免費..

客戶端類具有下面:

private HashMap<Integer, Study> StudyListByKey = new HashMap<Integer, Study>(); 

學習班具有低於:

private HashMap<Integer, Series> SeriesListByKey = new HashMap<Integer, Series>(); 

系列分類如下:

private HashMap<Integer, Image> ImageListByKey = new HashMap<Integer, Image>(); 

圖像類具有下面:

private ArrayList<byte[]> images = new ArrayList<byte[]>(); 

去除代碼的圖像數據低於:

public void removeDICOMImage() { 
    this.logger.info(this.images); 
    this.images = null; 
} 

不.. ..工作 我怎樣才能去除存儲器堆圖像數據△φ

那麼..盛大的..父類對象將免費..兒童 - >免費??

我錯了?

+0

釋放堆中的內容並不意味着將內存返回給操作系統。 – Henry

+0

JVM不一定將內存釋放到操作系統。它可以保留空閒的內存以預期將來的分配(這取決於JVM實現) –

+0

爲什麼不將對象不需要設置爲null。這將確保GC將它們從內存中移除並釋放JVM空間 –

回答

0

你可以通過System.gc()Runtime.gc()調用垃圾回收器,但這並不意味着你可以釋放你想要的outpointing引用。它的全部由JVM和OS決定。

+1

手動啓動GC週期在大多數情況下會產生相反的效果,因爲它會干擾JVM使用的策略。 – Henry

+0

@亨利謝謝,現在我的AWS服務器有時會死亡..由內存堆大小..我如何解決這個問題。我需要主動刪除對象 –

+0

只要確保不保留對不再需要的對象的引用,並讓其餘部分由JVM完成。 – Henry