學習筆記1:深入理解Java虛擬機器——JVM高階特性與最佳實踐_OOM(記憶體溢位)_虛擬機器引數設定_MAT
阿新 • • 發佈:2018-11-07
eclipse中設定debug標籤頁的vm引數
1,Run->Debug configurations->Java Application
2,選中已經寫好的專案
3,Arguments->VM arguments
4,在VM arguments 裡面就可以對虛擬機器的記憶體引數進行設定
5,設定完成後,Apply->Debug
6,過程結束
7.獲取dump檔案
8.用MAT工具進行分析.
設定引數如下
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\\dump.hprof
記憶體映像分析工具(例如eclipse memory analyzer)堆dump出來的堆轉儲快照進行分析,重點是確認記憶體中的物件是否是必要的.
也就是要先分清楚到底是出現了記憶體洩漏(memory leak)還是記憶體溢位(memory overflow)
import java.util.ArrayList; import java.util.List; public class HeapOOM { static class OOMObjec{ } public static void main(String[] args) { List<OOMObjec> list = new ArrayList<>(); while (true) { list.add(new OOMObjec()); } } }
注意專案名稱不要有下劃線,不然會報錯說找不到主類. [GC (Allocation Failure) 7727K->5313K(19456K), 0.0102958 secs] [GC (Allocation Failure) -- 13505K->19416K(19456K), 0.0150072 secs] [Full GC (Ergonomics) 19416K->10071K(19456K), 0.1473511 secs] [Full GC (Ergonomics) 17568K->15873K(19456K), 0.1319149 secs] [Full GC (Allocation Failure) 15873K->15869K(19456K), 0.0746161 secs] java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid27392.hprof ... Heap dump file created [27960490 bytes in 0.080 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Unknown Source) at java.util.Arrays.copyOf(Unknown Source) at java.util.ArrayList.grow(Unknown Source) at java.util.ArrayList.ensureExplicitCapacity(Unknown Source) at java.util.ArrayList.ensureCapacityInternal(Unknown Source) at java.util.ArrayList.add(Unknown Source) at HeapOOM.main(HeapOOM.java:14) -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\\dump [GC (Allocation Failure) 7626K->5249K(19456K), 0.0075257 secs] [GC (Allocation Failure) 13441K->11134K(19456K), 0.0121616 secs] [Full GC (Ergonomics) 11134K->11066K(19456K), 0.1505298 secs] [Full GC (Ergonomics) 18562K->16355K(19456K), 0.1338673 secs] [Full GC (Allocation Failure) 16355K->16343K(19456K), 0.0911646 secs] java.lang.OutOfMemoryError: Java heap space Dumping heap to D:\\dump ... Heap dump file created [27960542 bytes in 0.452 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Unknown Source) at java.util.Arrays.copyOf(Unknown Source) at java.util.ArrayList.grow(Unknown Source) at java.util.ArrayList.ensureExplicitCapacity(Unknown Source) at java.util.ArrayList.ensureCapacityInternal(Unknown Source) at java.util.ArrayList.add(Unknown Source) at HeapOOM.main(HeapOOM.java:14) ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [util.c:840]
1,堆是儲存物件例項的,即自己寫的類都是在堆中進行記憶體分配的;設定堆的大小:-Xmx20M(最大值) ,-Xms20M(最小值)。
2,棧是儲存區域性變數,操作棧,動態連結,方法出口(都在棧楨中) 的地方,呼叫方法時,會建立棧楨;設定棧的大小:-Xss128K。
3,方法區是存放Class的相關資訊,如類名,訪問修飾符,常量池,欄位描述,方法描述等。此外執行時常量池是屬於方法區的,即存放常量,靜態常量等;設定方法區大小,-XX:PermSize=10M和-XX:MaxPermSize=10M。
4,本地直接記憶體;設定本地直接記憶體大小:-XX:MaxDirectMemorySize(預設與-Xmx的值一樣)。