VisualVM 是一款免费的\集成了多个JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序作性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操做。算法
在内存分析上,Java VisualVM的最大好处是可经过安装Visual GC插件来分析GC(Gabage Collection)趋势、内存消耗详细情况。工具
一 Visual GC(监控垃圾回收器)性能
Java VisualVM默认没有安装Visual GC插件,须要手动安装,JDK的安装目录的bin目露下双击jvisualvm.exe,便可打开Java VisualVM,点击菜单栏 工具->插件 安装Visual GC插件
安装完成后重启Java VisualVM,Visual GC界面自动打开,便可看到JVM中堆内存的分代状况命令行
被监控的程序运行一段时间后Visual GC显示以下线程
要看懂上面的图必须理解Java虚拟机的一些基本概念:3d
堆(Heap) :JVM管理的内存叫堆调试
分代:根据对象的生命周期长短,把堆分为3个代:Young,Old和Permanent,根据不一样代的特色采用不一样的收集算法,扬长避短也。对象
Young(年轻代)
年轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的而且此时还存活的对象,将被复制“年老区(Tenured)”。须要注意,Survivor的两个区是对称的,没前后关系,因此同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor复制过来的对象。并且,Survivor区总有一个是空的。blog
Tenured(年老代)
年老代存放从年轻代存活的对象。通常来讲年老代存放的都是生命期较长的对象。
Perm(持久代)
用于存放静态文件,现在Java类、方法等。持久代对垃圾回收没有显著影响,可是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候须要设置一个比较大的持久代空间来存放这些运行过程当中新增的类。持久代大小经过-XX:MaxPermSize=进行设置。
GC的基本概念
gc分为full gc 跟 minor gc,当每一块区满的时候都会引起gc。
Scavenge GC
通常状况下,当新对象生成,而且在Eden申请空间失败时,就触发了Scavenge GC,堆Eden区域进行GC,清除非存活对象,而且把尚且存活的对象移动到Survivor区。而后整理Survivor的两个区。
Full GC
对整个堆进行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,所以应该尽量减小Full GC。有以下缘由可能致使Full GC:
上一次GC以后Heap的各域分配策略动态变化
System.gc()被显示调用
Perm域被写满
Tenured被写满
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;好比申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存后,没法释放已申请的内存空间,一次内存泄露危害能够忽略,但内存泄露堆积后果很严重,不管多少内存,早晚会被占光。其实说白了就是该内存空间使用完毕以后未回收。
二 Java VisualVM的其余功能
1.监视界面(cpu,类,堆,线程)
2.线程界面
3.Profile界面(性能剖析)
点击CPU按钮执行cpu分析查看方法
点击内存按钮执行内存分析查看类
4.堆dump和线程dump操做
Dump文件是进程的内存镜像,能够把程序的执行状态经过调试器保存到dump文件中,堆dump的dump文件内容以下图所示