簡體   English   中英

如果我們多次創建HashMap對象,則會發生內存泄漏

[英]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.

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