1. 程式人生 > >學習筆記1:深入理解Java虛擬機器——JVM高階特性與最佳實踐_OOM(記憶體溢位)_虛擬機器引數設定_MAT

學習筆記1:深入理解Java虛擬機器——JVM高階特性與最佳實踐_OOM(記憶體溢位)_虛擬機器引數設定_MAT

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的值一樣)。