JVM学习笔记-Gui工具篇
大约 2 分钟java基础jvmJVM
Visual VM
功能:
- 生成/读取堆内存快照
- 查看JVM参数和系统属性
- 查看运行中的虚拟机进程
- 生成/读取线程快照
- 程序资源的实时监控
- 远程环境监控
- CPU分析和内存分析
代码如下:
public class OOMTest {
public static void main(String[] args) {
ArrayList<Picture> list = new ArrayList<>();
while(true){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(new Picture(new Random().nextInt(1024 * 1024)));
}
}
}
class Picture{
private byte[] pixels;
public Picture(int length) {
this.pixels = new byte[length];
}
}
添加JVM参数-Xms600m -Xmx600m。上面的demo一直在产生新的对象并保持引用,所以最终会导致OOM。
Visual VM分析:
根据堆内存监控分析图可以得到堆逐渐增大却没有触发GC,说明对象一直存活,导致了内存泄漏。
从线程分配的数据来看,main线程分配字节数据较多。
通过CPU抽样知道CPU热点方法。
通过观察dump知道有大byte[]对象存在。
mat
mat是eclipse开源的一款JVM分析工具,主要特点是支持自动对内存泄漏进行分析和OQL语句查询。
通过分析dump文件可以自动分析内存泄漏,可以帮助我们快速定位到问题。
直方图:
补充概念:
浅堆(Shallow Heap)是指一个对象所消耗的内存。在32位系统中,一个对象引用会占据4个字节,一个int类型会占据4个字节,long型变量会占据8个字节,每个对象头需要占用8个字节。根据堆快照格式不同,对象的大小可能会向8字节进行对齐。
保留集:对象A的保留集指当对象A被垃圾回收后,可以被释放的所有的对象集合(包括对象A本身),即对象A的保留集可以被认为是只能通过对象A被直接或间接访问到的所有对象的集合。通俗地说,就是指仅被对象A所持有的对象的集合。
深堆:深堆是指对象的保留集中所有的对象的浅堆大小之和。
注意:浅堆指对象本身占用的内存,不包括其内部引用对象的大小。一个对象的深堆指只能通过该对象访问到的(直接或间接)所有对象的浅堆之和,即对象被回收后,可以释放的真实空间。
查看线程: