转自:http://www.cnblogs.com/wade-xu/p/4369094.html
这篇总结的很不错(本人亲自操手学习),留着以后复习备用,很适合入门级的学习者:
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。本文主要介绍如何使用 VisualVM 进行性能分析及调优。
准备工作
自从 JDK 6 Update 7 以后已经作为 Oracle JDK 的一部分,位于 JDK 根目录的 bin 文件夹下,无需安装,直接运行即可。
内存分析篇
VisualVM 通过检测 JVM 中加载的类和对象信息等帮助我们分析内存使用情况,我们可以通过 VisualVM 的监视标签对应用程序进行内存分析。
1)内存堆Heap
首先我们来看内存堆Heap使用情况,我本机eclipse的进程在visualVM显示如下:
随便写个小程序占用内存大的,运行一下
程序如下:
1 package jvisualVM;
2
3 public class JavaHeapTest {
4 public final static int OUTOFMEMORY = 200000000;
5
6 private String oom;
7
8 private int length;
9
10 StringBuffer tempOOM = new StringBuffer();
11
12 public JavaHeapTest(int leng) {
13 this.length = leng;
14
15 int i = 0;
16 while (i < leng) {
17 i++;
18 try {
19 tempOOM.append("a");
20 } catch (OutOfMemoryError e) {
21 e.printStackTrace();
22 break;
23 }
24 }
25 this.oom = tempOOM.toString();
26
27 }
28
29 public String getOom() {
30 return oom;
31 }
32
33 public int getLength() {
34 return length;
35 }
36
37 public static void main(String[] args) {
38 JavaHeapTest javaHeapTest = new JavaHeapTest(OUTOFMEMORY);
39 System.out.println(javaHeapTest.getOom().length());
40 }
41
42 }
查看VisualVM Monitor tab, 堆内存变大了
在程序运行结束之前, 点击Heap Dump 按钮, 等待一会儿,得到dump结果,可以看到一些Summary信息
点击Classes, 发现char[]所占用的内存是最大的
双击它,得到如下Instances结果
Instances是按Size由大到小排列的
第一个就是最大的, 展开Field区域的 values
StringBuffer类型的 全局变量 tempOOM 占用内存特别大, 注意局部变量是无法通过 堆dump来得到分析结果的。
另外,对于“堆 dump”来说,在远程监控jvm的时候,VisualVM是没有这个功能的,只有本地监控的时候才有。
###转载注明出处:http://www.cnblogs.com/wade-xu/p/4369094.html
2)永久保留区域PermGen
其次来