Java Memory Leak
Concept
不再使用的物件且無法被GC回收
原因
物件指向靜態變數參考
長字串呼叫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
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment