17_堆_定義
定義: Heap,通過new關鍵字創建的對象,都存放在堆內存中。
特點:
線程共享,堆中的對象都存在線程安全的問題
垃圾回收,垃圾回收機制重點區域。
18_堆_內存溢出
一個簡單的例子 java.lang.OutOfMemeryError:Java Heap spac
-Xmx8m
19_堆_內存診斷_jmap
1、jps
查看系統有哪些進程。
2、jmap
查看堆內存使用情況 jmap -heap PID
3、jconsole
圖形界面,多功能檢測工具,連續監測。
public class Demo1 {
public static void main(String[] args) throws InterruptedException {
System.out.println("1....");
Thread.sleep(30000);
byte[] array = new byte[1024 * 1024 * 10];//10M
System.out.println("2....");
Thread.sleep(30000);
array = null;//array沒有引用,可以被回收了
System.gc();
System.out.println("3...");
Thread.sleep(1000000L);
}
}
運行上面代碼,首先得到Demo進程PID
D:\openSourceProject\jvm1>jps
8916 Launcher
9876 RemoteMavenServer36
11656
13976 Demo1
13756 Jps
後每次輸出後,jmap -heap PID得到如下內容:
1、
D:\openSourceProject\jvm1>jmap -heap 13976
Attaching to process ID 13976, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4276092928 (4078.0MB)
NewSize = 89128960 (85.0MB)
MaxNewSize = 1425014784 (1359.0MB)
OldSize = 179306496 (171.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 67108864 (64.0MB)
used = 6711104 (6.40020751953125MB)
free = 60397760 (57.59979248046875MB)
10.000324249267578% used
From Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
PS Old Generation
capacity = 179306496 (171.0MB)
used = 0 (0.0MB)
free = 179306496 (171.0MB)
0.0% used
3175 interned Strings occupying 260400 bytes.
2、
D:\openSourceProject\jvm1>jmap -heap 13976
Attaching to process ID 13976, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4276092928 (4078.0MB)
NewSize = 89128960 (85.0MB)
MaxNewSize = 1425014784 (1359.0MB)
OldSize = 179306496 (171.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 67108864 (64.0MB)
used = 17196880 (16.400222778320312MB)
free = 49911984 (47.59977722167969MB)
25.62534809112549% used
From Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
PS Old Generation
capacity = 179306496 (171.0MB)
used = 0 (0.0MB)
free = 179306496 (171.0MB)
0.0% used
3176 interned Strings occupying 260456 bytes.
3、
D:\openSourceProject\jvm1>jmap -heap 13976
Attaching to process ID 13976, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4276092928 (4078.0MB)
NewSize = 89128960 (85.0MB)
MaxNewSize = 1425014784 (1359.0MB)
OldSize = 179306496 (171.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 67108864 (64.0MB)
used = 1342200 (1.2800216674804688MB)
free = 65766664 (62.71997833251953MB)
2.0000338554382324% used
From Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
PS Old Generation
capacity = 179306496 (171.0MB)
used = 1106008 (1.0547714233398438MB)
free = 178200488 (169.94522857666016MB)
0.6168253937659905% used
3162 interned Strings occupying 259464 bytes.
20_堆_內存診斷_jconsole
21_堆_內存診斷_jvirsualvm
案例:垃圾回收後,內存佔用依然很高
1.控制檯輸入jvistualvm,在1處選擇對應進程,2處點“dump”。
2.點擊“查找”,點擊第一條佔用內存最大的記錄。
3.找到問題所在,list中有過多大對象student,無法被清除。
public class Demo2 {
public static void main(String[] args) throws InterruptedException {
List<student> list = new ArrayList<>();
for (int i = 0; i < 200;i++){
list.add(new student());
}
Thread.sleep(10000000000L);
}
}
class student{
private byte[] big = new byte[1024 * 1024];
}
解決方法: 去官網下載即可, 我是win10系統, 官網鏈接, 下載後, 解壓, 打開bin目錄下的visualvm.exe即可使用
在這裏插入圖片描述
生成快照dump日誌方法
1、獲取JVM的dump文件的兩種方式
#出現 OOME 時生成堆 dump:
-XX:+HeapDumpOnOutOfMemoryError
#生成堆文件地址:
-XX:HeapDumpPath=/home/liuke/jvmlogs/
2、
jmap -dump:format=b,file=xxx.hprof
這會讓VM接到dump請求後直接把Java heap裏所有對象都dump下來,無論對象是死是活
3、
jmap -dump:format=b,live,file=xxx.hprof
這種則讓VM在接到dump請求時先做一次full GC,然後再dump;所以已經死掉的對象剛被GC清理掉,就不會出現在dump裏了。
第一種方式是一種事後方式,需要等待當前JVM出現問題後才能生成dmp文件,實時性不高
第二種方式在執行時,JVM是暫停服務的,所以對線上的運行會產生影響。所以建議第一種方式。
4、查看項目啓動參數:
ps aux|grep pid