千家信息网

如何使用VisualVM分析性能

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"如何使用VisualVM分析性能",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何使用VisualVM分析性能"吧!这里需要使用一
千家信息网最后更新 2026年10月31日如何使用VisualVM分析性能

这篇文章主要讲解了"如何使用VisualVM分析性能",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何使用VisualVM分析性能"吧!

这里需要使用一个java自带的一个工具,VisualVM。使用IDEA下载一个VisualVM。

一、查看程序的JVM内存

首先任务参数有不要设置,然后编写一个程序。

public class JavaHeapTest {

public final static int OUTOFMEMORY = 200000000;

private String oom;

private int length;

StringBuffer tempOOM = new StringBuffer();

public JavaHeapTest(int leng) {

this.length = leng;

int i = 0;

while (i < leng) {

i++;

try {

tempOOM.append("a");

} catch (OutOfMemoryError e) {

e.printStackTrace();

break;

}

}

this.oom = tempOOM.toString();

}

public String getOom() {

return oom;

}

public int getLength() {

return length;

}

public static void main(String[] args) {

JavaHeapTest javaHeapTest = new JavaHeapTest(OUTOFMEMORY);

System.out.println(javaHeapTest.getOom().length());

}

}

然后使用VIsualVM运行程序。

程序运行起来,但是第一次需要设置VisualVM的位置

程序运行起来后后堆的情况。

上面的图是没有设置任何程序的事情下做的,为什么需要看堆的大小,因为堆存放对象的实例,一般都会需要设置该值,在没有做任何设置的时候,就会看到堆的内存可能达到1G的大小。有时候需要模拟线上环境的上的Java内存大小,在IDEA中设置下一年堆的大小,这里设置堆的初始化和最大值都一样,以避免每次垃圾回收完成后JVM重新分配内存

设置之后运行程序,堆的内存变为设置的大小,但是这个时候有可能出现异常,在我的电脑上就出现 java.lang.OutOfMemoryError: Java heap space,该异常就是设置的堆内存太小导致,但是一般情况下不会出现该情况,因为上面的程序并不需要特别大的程序,可能是我的笔记本电脑的原因。

上面知道看堆的大小,接下来可以看一下堆中存储了什么。在程序运行的时候,需要快速点击堆dump,然后就看到如下

双击某个列表之后查看其中的内容,而存储最多的就是程序中设置的tempOOM参数,此时知道了堆中存储最大的内容是什么,如果是其他程序,某一个字段占用特多的内存,可能就是程序出现问题了,那么就需要对那个字段进行优化。

二、查看程序的线程情况

接下来运行下面的程序:

public class DeadLock {

public static void main(String[] args) {

Resource r1 = new Resource();

Resource r0 = new Resource();

Thread myTh2 = new LockThread1(r1, r0);

Thread myTh0 = new LockThread0(r1, r0);

myTh2.setName("DeadLock-1 ");

myTh0.setName("DeadLock-0 ");

myTh2.start();

myTh0.start();

}

}

class Resource {

private int i;

public int getI() {

return i;

}

public void setI(int i) {

this.i = i;

}

}

class LockThread1 extends Thread {

private Resource r1, r2;

public LockThread1(Resource r1, Resource r2) {

this.r1 = r1;

this.r2 = r2;

}

@Override

public void run() {

int j = 0;

while (true) {

synchronized (r1) {

System.out.println("The first thread got r1's lock " + j);

synchronized (r2) {

System.out.println("The first thread got r2's lock " + j);

}

}

j++;

}

}

}

class LockThread0 extends Thread {

private Resource r1, r2;

public LockThread0(Resource r1, Resource r2) {

this.r1 = r1;

this.r2 = r2;

}

@Override

public void run() {

int j = 0;

while (true) {

synchronized (r2) {

System.out.println("The second thread got r2's lock " + j);

synchronized (r1) {

System.out.println("The second thread got r1's lock" + j);

}

}

j++;

}

}

}

程序运行之后,查看线程标签后直接告警出现了死锁的线程。

上面的程序可以看到蓝色部分为线程正常运行,黄色为等待。

三、使用VisualGC来查看年轻代,老年代的堆内存的GC情况,如果是频繁的GC,那么可能就是内存不足,就需要增加堆内存。

上面的图大部分的GC都是在Eden区,即对象都是朝生暮死的,并且发生了GC time收集到0条GC,那么就是该程序一直运行可以(这里程序运行时间很短,在长时间观察,可以得到更多的信息,如果是将堆内存设置很小的时候,那么就会经常发生GC的情况)

感谢各位的阅读,以上就是"如何使用VisualVM分析性能"的内容了,经过本文的学习后,相信大家对如何使用VisualVM分析性能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

程序 内存 运行 情况 大小 就是 面的 性能 分析 内容 时候 线程 存储 学习 最大 接下来 参数 字段 对象 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网佳科技有限公司 上海挚品互联网科技 为想互联网科技 奇酷互联网科技公司 腾讯科技 互联网女皇 唐信互联网科技 大连 狮子座互联网科技培训 华中科技有哪些互联网大佬 科技与互联网的利与弊 洛阳昕诺飞互联网科技有限公司 电子科技大学互联网创业大赛 健康食品互联网创新科技园项目 佛山市拉法互联网科技有限公司 玉溪新华互联网科技好不好 互联网科技公司营业执照怎么办理 小米互联网科技园入驻 互联网安防科技感 2021世界互联网领先科技成果发布 艺电能源互联网科技有限公司招聘 中国主要互联网科技公司 中智农互联网科技 互联网科技工作委员会副主任毛军 今日互联网科技 涨乐互联网科技 科技信息互联网 紫鲸互联网科技 腾讯科技 互联网女皇 哈尔滨新华互联网科技学院 注册互联网科技公司经营范围大全 上海旺乐尼互联网科技有限公司
0