java堆内存诊断
- jps 工具
- jmap 工具
- 查看堆内存占用情况 jmap - heap 进程id
- jconsole 工具
- 图形界面的,多功能的监测工具,可以连续监测(不光可以监测堆,也可以监测线程和cpu等)
案例一
案例代码
public class Demo1_4 {
public static void main(String[] args) throws InterruptedException {
System.out.println("1...");
Thread.sleep(30000);
byte[] array = new byte[1024 * 1024 * 10];
System.out.println("2...");
Thread.sleep(20000);
array = null;
System.gc();
System.out.println("3...");
Thread.sleep(1000000L);
}
}
jmap的使用
使用jps查看进程

在输出1,2,3后分别使用jmap命令查看堆内存情况
输出1后占用堆内存为6.4m

输出2后占用堆内存为16.4m

进行gc输出3后堆内存只占用1.2m

jconsole的使用

在控制台输入jconsole后会出现图形界面,选择当前我们想看的进程即可

案例二
描述:垃圾回收后,内存占用仍然很高
案例代码
import java.util.ArrayList;
import java.util.List;
public class Demo1_13 {
public static void main(String[] args) throws InterruptedException {
List<Student> students = new ArrayList<>();
for (int i = 0; i < 200; i++) {
students.add(new Student());
}
Thread.sleep(1000000000L);
}
}
class Student {
private byte[] big = new byte[1024*1024];
}
使用jvisualvm工具

在监视界面点击堆Dump,截下堆的快照


可以看见文件的大小为204MB,点击查找

右面会出现占用堆内存的信息,可以点击分别查看堆内存的详细信息
看见文件的大小为204MB,点击查找 ![[外链图片转存中...(img-6km0Cn2s-1652018802600)]](https://img-blog.csdnimg.cn/0931d11f94a349e2b298c4caef003f56.png) 右面会出现占用堆内存的信息,可以点击分别查看堆内存的详细信息 
|