跳至主要內容

JVM学习笔记-Gui工具篇

xw大约 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所持有的对象的集合。

深堆:深堆是指对象的保留集中所有的对象的浅堆大小之和。

注意:浅堆指对象本身占用的内存,不包括其内部引用对象的大小。一个对象的深堆指只能通过该对象访问到的(直接或间接)所有对象的浅堆之和,即对象被回收后,可以释放的真实空间。


查看线程: