TSS翻譯:常見的Java內存問題第一部分 – JAVA編程語言程序開發技術文章


 


原文鏈接:http://www.theserverside.com/news/thread.tss?thread_id=62217


 


http://blog.dynatrace.com/2011/04/20/the-top-java-memory-problems-part-1/


 




內存和垃圾收集器一直是Java應用程序最值得關註的問題之一。當我們對java有JVM的內存收集機制而津津樂道的時候,恐怕大多數人又對GC垃圾收集的機制莫諱如深。dynaTrace的Michael Kopp 也有同感,不過他把引起java內存泄漏的主要原因列出來瞭。


 


<!–[if !supportLists]–>1、<!–[endif]–>線程局部變量 Thread Local Variables


主要是在使用線程池的情況下容易出現,使用heap dump 容易找出問題所在;


 


2、<!–[endif]–>可變的靜態字段和集合Mutable static fields and collections


避免這種情況的很簡單少用。A good architectural rule is not to use mutable static objects at all, most of the time there is a better alternative.


 


3、<!–[endif]–>循環和復雜的雙向引用Circular and complex bi-directional references


對方舉瞭一個經典的例子:


org.w3c.dom.Document doc = readXmlDocument();
org.w3c.dom.Node child = doc.getDocumentElement().getFirstChild();
doc.removeNode(child);
doc = null;


 


<!–[if !supportLists]–>4、<!–[endif]–>JNI內存泄漏 JNI memory leaks


 


用的不多,不多說瞭。


 


<!–[if !supportLists]–>5、<!–[endif]–>類的 Equals/hashcode 不正確的實現


 


這樣的類使用HashMap容易的時候容易出問題。


避免這種情況的方法是做測試,比如這個工具:http://code.google.com/p/equalsverifier/




<!–[if !supportLists]–>6、<!–[endif]–>類加載器引起的內存泄漏


 


Class Loader 的層面比較底層,一般是應用程序服務器和OSGi 容器中容易出現。


 


也許回復更精彩,把1,2,6綜合起來瞭:


static ThreadLocal myWrapper =
new ThreadLocal() {
NotThreadSafeObject initialValue() {
return new NotThreadSafeObject();
}
}



myWrapper.get().someMethod()


More details at http://www.szegedi.org/articles/memleak.html


 


 


如何使用:dynaTrace 見這裡:


http://blog.dynatrace.com/2011/04/13/application-performance-monitoring-in-production-a-step-by-step-guide/


 


 

發佈留言