2015-02-11 33 views
-9

如何減少Java應用程序中的內存泄漏?如何減少java中的內存泄漏?

如果您忘記關閉資源或未釋放對象的引用,則可能會發生Java中的內存泄漏。

代碼是:

import java.util.Map; 
public class MemLeak { 
public final String key; 
public MemLeak(String key) { 
    this.key = key; 
} 

public static void main(String args[]) { 
    try { 
     Map map = System.getProperties(); 
     for(;;) { 
     map.put(new MemLeak("key"), "value"); 
     } 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+3

我在這篇文章中看不到任何問號。你的問題是什麼? – amit 2015-02-11 09:17:57

+8

這不是內存泄漏*。您保持對正在添加的條目的引用。你無盡的*消耗*記憶,但它不是泄漏。這個計劃的重點是什麼? – 2015-02-11 09:18:02

+0

這不是一個問題 – Mysterion 2015-02-11 09:18:09

回答

2

讓分析幾個可能的錯誤消息:

java.lang.OutOfMemoryError: Java heap space 
java.lang.OutOfMemoryError: PermGen space 
java.lang.OutOfMemoryError: Requested array size exceeds VM limit 
java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space? 
java.lang.OutOfMemoryError: <reason> <stack trace> (Native method) 

這裏的MemLeak類:

package com.post.memory.leak; 

import java.util.Map; 

public class MemLeak { 
    public final String key; 

    public MemLeak(String key) { 
     this.key =key; 
    } 

    public static void main(String args[]) { 
     try { 
      Map map = System.getProperties(); 

      for(;;) { 
       map.put(new MemLeak("key"), "value"); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

注:內存泄漏是不是由於上線的無限循環14:無限循環會導致資源耗盡,但不會導致內存泄漏。如果我們已經正確實施equals()hashcode()方法,那麼即使在無限循環下代碼也可以正常運行,因爲我們在HashMap中只有一個元素。

3

「如何減少Java應用程序的內存泄漏?」 - 不要這樣做!

您的應用程序正試圖在堆中構建一個無限大小的數據結構。堆基本上不可避免地是有限的。

它不起作用。如果您忘記關閉資源可能會出現


Java中的內存泄漏,或者一個對象的引用不會被釋放。

這個應用程序是否合格爲「內存泄漏」值得懷疑。如果你偶然做了這樣的事情,那麼它可能被描述爲泄漏。但是你的代碼用這個看起來是故意的意圖來做到這一點。


我假設你明白爲什麼會構建一個無限的數據結構。這是因爲你的MemoryLeak類繼承equalshashcodeObject。這意味着平等與對象身份相同,因此每個MemoryLeak實例都會成爲映射中的一個獨特密鑰。因此,您只需向地圖添加越來越多的條目,直到內存不足。