[英]Memory leak if we create HashMap object multiple times
public class TestProcessor{
public void fillData(){
boolean success = true;
HashMap<String,String> hMap = null;
if (success){
hMap = new HashMap<String,String>();
hMap.put("one","java");
hMap.put("two","servlet");
}
if(hMap! = null){
processData(hMap);
}
}
public void processData(HashMap<String,String> map){
String param1 = map.get("one");
String param2 = map.get("two");
}
}
在上面的代碼中,如果我們多次調用fillData()方法並且if條件變為true,那么HashMap對象將被創建多次,這會導致Memory Leak問題嗎?如果發生內存泄漏,那么我們該如何解決呢?
它不應該造成內存泄漏,因為您將替換現有的哈希圖,這將使舊的哈希圖被垃圾回收。
如果您在外部保留對哈希圖中內部對象的引用,則可能導致它們被保留。
*根據您的語法,我假設這是java。
Java虛擬機(JVM)主動並自動管理您的應用程序使用的內存。 關於Java的內存管理,請記住以下幾點:
內存會自動在堆內存中分配給程序創建的對象。
當程序無法再訪問對象時(通常是由於超出范圍而導致不能訪問引用該對象的變量),內存將被稱為垃圾回收的進程自動回收。
垃圾收集是自動的且不確定的。 您的程序無法知道(或預測)何時會發生垃圾回收(因此您不確切知道何時將回收無法訪問的對象)。
在大多數情況下,JVM很好地管理內存,即使程序長時間運行(並創建和回收許多對象),也不會發生內存泄漏。
根據上述理由,您顯示的代碼段不會導致任何內存泄漏。 在Java中,只有少數幾種情況會發生內存泄漏:
1.執行自己的內存管理時。 如果您為對象實現自己的數據結構,則可能發生內存泄漏。 例如,如果您創建自己的堆棧實現,則從堆棧中“彈出”的對象仍然可以對其進行有效引用。 發生這種情況時,即使對象不再位於堆棧的活動部分中也不會被垃圾回收。 這是為數不多的情況之一,在這種情況下,將null
主動分配給可能引用不再“正在使用”的對象的元素可能很重要。
2.任何時候只要您有一個長期對象,而該對象持有對您打算短暫存在的對象的引用。 可能導致內存泄漏的最常見情況是使用非靜態內部類和匿名類(它們均包含對其封閉實例的引用)。
每個非靜態內部類都有對其周圍類的隱式引用。 匿名類是相似的。 要成功創建內存泄漏,只需將內部類對象傳遞給保留對所提供對象的引用的方法即可。
為什么這會導致內存泄漏? 假設您實現了類似緩存的功能。 接下來,沿着執行路徑到達本地對象,該對象將其一些內部類對象存儲到緩存中。 本地對象超出范圍后,將不再進行垃圾收集! 緩存中的內部類對象持有對周圍對象的引用,並且該引用仍然是可引用的,因此不再是垃圾回收的候選對象。 匿名類也是如此!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.