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