Concept

不再使用的物件且無法被GC回收
MemoryLeakDef

原因

物件指向靜態變數參考

長字串呼叫String.intern()方法

String.interal() API會將字串放入String pool中,在pool中的字串將不會被GC回收

  • Java 7以前,需要操作長字串,則加大permanent generation,-XX:MaxPermSize =
  • Java 8,Metaspace取代PermGen,不會導致OutOfMemoryError

Unclosed Streams

例如:BufferedReader等類型Stream

Unclosed connection

例如:資料庫、FTP Server、URLConnection

未實作hashCode()與equals的物件寫入HashSet

由於物件未實現equals與hashCode導致加入HashSet中的物件,重複的物件只會增加不會移除

Memory Profilers

  • jps:查看當前系統有哪些java process
  • jmap:查看heap占用情形,jmap -heap processId
  • jconsole:圖形介面,多功能監測工具
  • jvisualvm: visualVM

reference