VisualVM is a visual tool integrating commandline JDK tools and lightweight profiling capabilities. Designed for both development and production time use.
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。本文主要介绍如何使用 VisualVM 进行性能分析及调优。
Ø 堆 -- 这里要说明下堆内存的组成部分,堆是由老年代和新生代组成,其中新生代有由"伊甸园"和"两个幸存区组成"三部分组成,堆视图看到的资源占用实际是"老年代"、"伊甸园(Eden)"、"两个幸存者(Survivor )"的一个综合情况。
Ø PermGen -- Perm 区用来存放java类以及其他虚拟机自己的静态数据,(常被称为持久代或者方法区)
Ø 类 -- 此视图 主要展示 当前程序加载了多少个类
Ø 线程 -- 当前程序的线程启动情况
§ 执行垃圾回收 -- 手动触发一次GC 相当于在程序代码中调用(System.gc()),如果是远程连接到生产环境中请慎重点击。
§ 堆Dump -- 生产当前程序的内存快照hprof文件,对于分析内存溢出问题比较有帮助。
(可以查看当前程序内存中的所有对象)
Ø 线程dump – 此按钮主要生产当前程序中所有线程的快照(对分析线程死锁,比较有帮助)
Ø 时间线 – 展示每个线程的实时运行状态(不同颜色代表不同的状态)
内存-> 堆柱状图 – 展示堆内存中各种对象占用的字节数和总实例数
内存->PermGen – 展示方法区各种对象消耗的内存情况
CPU->线程CPU时间 – 主要展示线程消耗的CPU资源信息
安装visualgc插件(java.net网站已关闭),插件下载后导入,插件地址:
http://visualvm.github.io/pluginscenters.html
有人说“JVM的内存分为两块堆和栈”,还有人说"JVM的内存分为三块(新生代、老年代、方法区)"该有个结论了
对于堆栈说法的人他们是根据下图中的维度来看问题的
要看懂上面的图必须理解Java虚拟机的一些基本概念:
堆(Heap) :JVM管理的内存叫堆
分代:根据对象的生命周期长短,把堆分为3个代:Metaspace,Old和Young,根据不同代的特点采用不同的收集算法,扬长避短也。
GC的基本概念
gc分为full gc 跟 minor gc,当每一块区满的时候都会引发gc。
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。其实说白了就是该内存空间使用完毕之后未回收。
jvisualvm和jmc都是JDK自带的监控工具。jmc监控数据比jvisualvm更加丰富。它们都在JDK bin目录中
1. Tomcat环境变量指定的好习惯
安装完Tomcat之后,配置CATALINA_HOME和CATALINA_BASE环境变量,如果需要指定环境变量或者JVM参数值,根据catalina.sh文件中的注释说明单独在setenv.sh或者setenv.bat文件中指定,这样catalina.sh在执行的时候会自动读取。
2. 配置启用Tomcat JMX Remote
Java Visual VM远程监控Tomcat,配置参见:
JAVA_OPTS="
-Djava.rmi.server.hostname=192.168.88.29
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8089
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access"
如果authenticate=false的时候不需要配置paasword.file和access.file.否则需要在access.file中指定用户名和读写权限,格式如:
monitorRole readonly
controlRole readwrite
password.file中指定用户名和密码,格式如:
monitorRole tomcat
controlRole tomcat
文档中有个小提示:The password file should be read-only and only accessible by the operating system user Tomcat is running as. (意思是password.file的读写权限是400,仅运行tomcat服务的操作系统用户可以访问)
服务器上启动Tomcat,本地运行jvisual.exe配置JMX,连接远程Tomcat进行监控。
接下来介绍另一个JDK自带的监控工具jmc,打开bin/jmc.exe 之后,jmc即可扫描出本地运行的JVM进程
选择一个进程,点开选择MBean服务器,右键 启动JMX控制台,即可看到监控信息
如果想要用jmc监控远程的JVM进程,配置方式和jvisualvm方式一一样即可。