Java 自带性能监控工具:监视和管理控制台 jconsole 的使用
1. 前言
想验证你对 jvm 配的一些调优参数(比如 Xms、Xmx 等)有没有起作用吗?
想不想实时监控你自定义的线程池的在实际运行时的线程个数、有没有死锁?
应用出现 java.lang.OutOfMemoryError: Java heap space,你知道需要去调整 Xms、Xmx。想不想实时监控你的 Java 应用的堆内存使用情况,并根据峰值等数据设置最适合你的 Xms、Xmx 等参数?
应用出现 java.lang.OutOfMemoryError: PermGen space,你知道需要去调整 XX:PermSize、XX:MaxPermSize。想不想找到你的应用的永久区 PermGen 的使用峰值,并根据其去设置合理的 XX:PermSize、XX:MaxPermSize 等参数?
我们都知道,JVM 堆内存划分为年轻代和年老代。JVM 默认下的年老代与年轻代的比例(即 XX:NewRatio,这个名字容易让人产生混淆,即认为是年轻代比年老代)为 2(即把 JVM 堆内存平均分成了三份,年老大占用了两份,而年轻代占用一份。参考资料 Sun Java System Application Server Enterprise Edition 8.2 Performance Tuning Guide),这个比例并不适合所有情况,特别是当你的应用里局部变量远远大于全局变量,而且大量局部变量生命周期都很短的时候。如何根据应用实时的运行运行情况合理配置年轻代(Young Generation,即 Eden 区和两个 Survivor 区之和)和年老代(Old Generation,即 Tenured 区)的比例 XX:NewRatio 值?
Java 自带性能监控工具:监视和管理控制台 jconsole,它可以提供 Java 某个进程的内存、线程、类加载、jvm 概要以及 MBean 等的实时信息,也许能够对以上问题提供参考。
2. JVM 一些参数
在启动 jconsole 之前我们先来回顾一下 JVM 的一些主要参数:
-Xms 初始/最小堆内存大小
-Xmx 最大堆内存大小
-Xmn 年轻代大小
-XX:NewSize 年轻代大小
-XX:MaxNewSize 年轻代最大值
-XX:NewRatio 年老代与年轻代比值
-XX:MaxPermSize 持久代最大值
-XX:PermSize 持久代初始值
有些资料说,Xms、Xmx 设置的是 JVM 内存大小,是不对的,JVM 除了留给开发人员使用的堆内存之外还有非堆内存。
读者可能发现,有三种方式可以划分年轻代大小:-Xmn 方式、-XX:NewSize + -XX:MaxNewSize 方式、-XX:NewRatio 方式。三种都可以,优先级从高到低依次是 -XX:NewSize + -XX:MaxNewSize 方式、-Xmn 方式、-XX:NewRatio 方式,也就是说配置了前面优先级高的后面的优先级低的就被覆盖掉了。
3. 本机启用 jconsole 以监控 Java 进程
CMD 切换到 %JAVA_HOME%/bin 目录,直接执行 jconsole

即可打开 Java 监视和管理控制台:

本地进程列表里显示了所有本地执行中的 Java 进程,双击你感兴趣的那个进程(比如 PID 为 8504 那个),即可对该进程进行监控了:

4. 远程监控 Java 进程
要对 Java 进程进行远程监控,在启动它的时候需要启用 JMX。
以远程主机上的 tomcat 为例,先为 jmx 找一个可用的远程端口,比如 9999:

No news is good news~在 %TOMCAT_HOME%/bin/catalina.sh 文件的前面加上以下配置:
JAVA_OPTS="-Xms1024m -Xmx2048m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
如图

这样写在 tomcat 关闭的时候(执行 %tomcat%/bin/shutdown.sh)会报端口已使用异常:
错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 9999; nested exception is:
java.net.BindException: 地址已在使用
这是因为 tomcat 在启动、停止的时候都会执行 JAVA_OPTS 配置。这样就只能使用 kill -9 来关闭 tomcat 了...
解决办法是把监控配置写在 CATALINA_OPTS 里:
JAVA_OPTS="-Xms1024m -Xmx2048m -XX:MaxPermSize=128m"
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
就可以了。CATALINA_OPTS 配置只是在 tomcat 启动的时候执行。参考资料:https://bowerstudios.com/node/636。
然后重启 tomcat,在本机打开 Java 监视和管理控制台,"远程进程" 输入远程主机名和 jmx 端口号:

点击 "连接" 按钮,即可对远程主机上的 tomcat 进行实时监控了:

5. jconsole 提供的一些有用信息
接着第 4 步的案例往下看。
5.1. JVM 设定信息是否起作用检查
点击 "VM 概要" 可以查看到刚才我们设定的 JAVA_OPTS 的一些参数已经奏效了:

5.2. tomcat 线程池、自定义线程池数量情况实时监控
还在为 tomcat 线程池的神秘面纱而头疼?还在为自己定义的线程池 "黑盒" 一般而苦恼?看看下图:

我们的 tomcat 刚启动,从上图可以看出只有一个 http-8080-Acceptor-0 线程,我们去访问一下我们的项目,然后再回来看看:

http-8080 线程一下子增长到了 8 个。是不是一切一目了然,尽在掌握之中?
5.3. 内存使用实际消耗
点击 Java 监视和管理控制台 "内存" 叶项,可以看到 tomcat 堆内存的使用情况:

图表里有很多选项:

我们看一下 Eden 区:


Eden 区基本和整个堆内存的走势差不多。再看 Survivor 区:

Survivor 区在较短时间内的走势相对平稳。再看 Old Gen 区:

这个走势更加平稳,而且对比 Survivor 区、Old Gen 区两张图,可以很明显地看出,在大约 19:58 那个时刻有将一批对象从 Survivor 区移到 Old Gen 区。最后看 Perm Gen 区。
这个走势最平稳了。可以明显看出,在大约 19:58,在我们访问一下我们的项目的时候,一些新的 class 等静态资源加载到了 JVM 中。5.4 的加载类数的图也证实了这一点。
5.4. tomcat 加载类的情况

6. 配合 jmap 的使用

先找到我们 tomcat 进程的 PID 是 13863,然后执行 jmap -heap 13863:

Heap Configuration 里列的基本就是我们刚才配的那些,比如 MaxHeapSize 是 2048 MB,MaxPermSize 是 128 MB。这个和 5.1 里的是一样的。
Java 自带性能监控工具:监视和管理控制台 jconsole 的使用的更多相关文章
- Java 自带性能监控工具:监视和管理控制台jconsole的使用
关于JConsole工具的使用请参见:http://blog.csdn.net/defonds/article/details/45064297
- java自带的监控工具VisualVM(二)远程监控
ps:尝试了网上的几个网友提供的方法,始终不得其法,汇总后,终于尝试成功!将一些需要注意的细节也记录下来以后备用! 我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目 ...
- java自带的监控工具VisualVM一
转自:http://www.cnblogs.com/wade-xu/p/4369094.html 这篇总结的很不错(本人亲自操手学习),留着以后复习备用,很适合入门级的学习者: VisualVM 是一 ...
- java虚拟机(十)--性能监控工具测试内存溢出和死锁基本思路
在之前就曾经简单介绍过jdk自带的性能检测工具,但是只是很入门的内容.没有真正的用过都是白扯了,面试的时候也说不过去,更别提真正 在生产环境去解决问题,所以这里我们学习一下真正解决问题的过程,最起码面 ...
- 011 - JDK自带的性能监控工具
一.概要: jps -l 查看现有的java进程 jps -l 显示所有正在运行的java进程id jstack 查看Java线程 jstack -l pid; 做thread du ...
- Java虚拟机常用的性能监控工具
基础故障处理工具 jps: 虚拟机进程状况工具 功能:来处正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及本地虚拟机唯一ID. 它是使用频率最高的命令行工具,因为其他JDK工具大多需要输入他查询到 ...
- (转载)Java自带的GUI性能监控工具Jconsole以及JisualVM简介
原文链接:http://blog.csdn.net/chendc201/article/details/22905503 1 Jconsole 1.1 简介以及连接 JConsole是一个基于JMX的 ...
- Jconsole: JAVA 监视和管理控制台简介
Jconsole: JAVA 监视和管理控制台简介 JDK中除了提供大量的命令行之外,还提供两个功能强大的可视化工具:JConsole和VisualVM. 之前对java的调试一直停留在 右键-> ...
- JProfiler - Java的性能监控工具
简介 JProfiler是一款Java的性能监控工具.可以查看当前应用的对象.对象引用.内存.CPU使用情况.线程.线程运行情况(阻塞.等待等),同时可以查找应用内存使用得热点,即:哪个对象占用的内存 ...
随机推荐
- 单行中文字和图片的相关height和line-height特性
这几天在做仿京东的产品页,发现在制作过程中的一些问题,需要好好研究下. 需要实现的效果如上图所示: 在写CSS样式的时候,对于我的关于竖线的做法是: 设置高度为14,border样式,但导致了一个问题 ...
- 【JZOJ4964】【GDKOI2017模拟1.21】Rhyme
hafy 由于多次交换邮票没有满足所有人的需求,小Z被赶出了集邮部.无处可去的小Z决定加入音乐部,为了让音乐部的人注意到自己的才华,小Z想写一首曲子.为了让自己的曲子更好听,小Z找到了一些好听曲子作为 ...
- 【JZOJ4783】【NOIP2016提高A组模拟9.15】Osu
题目描述 输入 输出 样例输入 4 2 1 2 2 2 0 2 3 0 0 4 2 0 样例输出 1 2 1 数据范围 样例解释 圆圈只在出现的时刻有效.即:时刻t_i时鼠标位置恰好在(x_i,y_i ...
- 【JZOJ4756】【NOIP2016提高A组模拟9.4】幻象
题目描述 phantom是一位爱思考的哲♂学家. 最近phantom得到了森の妖精的真传.在他练功的时候, 每秒他的思绪中都有一定的概率浮现出奇♂异的幻象,持续x秒的幻象将产生x^2 的幻象值. ph ...
- sql标签和include标签的使用
<sql>用来封装SQL语句, <include>用来调用<sql>封装的语句 代码片段: <sql id="select"> SE ...
- 阿里云对象存储OSS支持版本管理特性
阿里云对象存储OSS现已经全面支持“对象版本管理”特性.该功能适用于所有的存储类型以及区域.当Bucket启用该特性后,“对象版本管理”功能可以保护和恢复误删除.误覆盖的数据. 对象存储OSS“版本管 ...
- css 的float和inline-block区别
CSS布局创建网站,浮动绝对占据了很大的比例.大块区域如主内容及侧边栏,以及在其中的小块区域,都可以看到浮动的影子.这里浮动是唯一的解决方案吗? 浮动通常表现正常,但有时候搞起来会很纠结.特别是处理内 ...
- 散列表(Hash Table)
散列表(hash table): 也称为哈希表. 根据wikipedia的定义:是根据关键字(Key value)而直接访问在内存存储位置的数据结构.也就是说,它通过把键值通过一个函数的计算,映射到表 ...
- 在Debug模式下,如何给.lib和.dll添加一个d标记(*d.lib,*d.dll)
选中工程->右键->属性->配置属性->常规,可以看到项目默认值的配置类型有好几种类型,选择静态库类型生成lib文件,选择动态库类型生成dll文件,选择应用程序生成exe文件, ...
- MaxCompute 费用暴涨之存储压缩率降低导致SQL输入量变大
现象:同样的SQL,每天处理的数据行数差不多,但是费用突然暴涨甚至会翻数倍. 分析: 我们先明确MaxCompute SQL后付费的计费公式:一条SQL执行的费用=扫描输入量 ️ SQL复杂度 ️ 0 ...