关闭

Java 自带性能监控工具:监视和管理控制台 jconsole 的使用

标签: jconsolejmapjvm调优java虚拟机内存调优
24905人阅读 评论(2) 收藏 举报
分类:

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
CMD 切换到 JAVA_HOME bin 目录,直接执行 jconsole

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

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


4. 远程监控 Java 进程

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

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的JAVA_OPTS配置

【博主 20150526 加注:开始】这样写在 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【博主 20150526 加注:结束】

然后重启 tomcat,在本机打开 Java 监视和管理控制台,"远程进程" 输入远程主机名和 jmx 端口号:

jmx 远程连接

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


5. jconsole 提供的一些有用信息

接着第 4 步的案例往下看。

5.1. JVM 设定信息是否起作用检查

点击 "VM 概要" 可以查看到刚才我们设定的 JAVA_OPTS 的一些参数已经奏效了:
JAVA_OPTS 的一些参数已经奏效

5.2. tomcat 线程池、自定义线程池数量情况实时监控

还在为 tomcat 线程池的神秘面纱而头疼?还在为自己定义的线程池 "黑盒" 一般而苦恼?看看下图:
tomcat线程情况

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

http-8080 线程一下子增长到了 8 个。是不是一切一目了然,尽在掌握之中?

5.3. 内存使用实际消耗

点击 Java 监视和管理控制台 "内存" 叶项,可以看到 tomcat 堆内存的使用情况:
tomcat 堆内存的使用情况

图表里有很多选项:
图表里有很多选项

我们看一下 Eden 区:
Eden区

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

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

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

5.4. tomcat 加载类的情况

tomcat 加载类的情况


6. 配合 jmap 的使用

先找到我们 tomcat 进程的 PID 是 13863

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

Heap Configuration 里列的基本就是我们刚才配的那些,比如 MaxHeapSize 是 2048 MB,MaxPermSize 是 128 MB。这个和 5.1 里的是一样的。


参考资料

3
0
查看评论

JConsole jvm分析工具

一、JConsole是什么     从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )...
  • Leon20160711
  • Leon20160711
  • 2016-08-25 18:27
  • 931

JConsole使用手册详解

一篇Sun项目主页上介绍JConsole使用的文章,前段时间性能测试的时候大概翻译了一下以便学习,今天整理一下发上来,有些地方也不知道怎么翻,就保留了原文,可能还好理解点,呵呵,水平有限,翻的不好,大家多多包涵。 JConsole毕竟是JDK自带的东西,功能虽然没有一些商业软件那么强大,但是稳...
  • lifuxiangcaohui
  • lifuxiangcaohui
  • 2014-07-04 16:09
  • 30296

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

一、JConsole是什么     从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )...
  • libaolin198706231987
  • libaolin198706231987
  • 2017-02-13 21:46
  • 1525

运用Jconsole监控JVM

     Jconsole是JDK自带的监控工具。它用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。而且本身占用的服务器内存很小,甚至可以说几乎不消耗,不失为一款好工具。 ...
  • lengyuhong
  • lengyuhong
  • 2011-02-22 16:26
  • 22766

JConsole&VisualVM监控总结

简介JConsole(以下写作jconsole),VisualVM(以下写作jvisualvm ) 都是比较好的JVM调优工具,且都属于JDK自带工具,可在命令行直接启动。应用示例Server端(需要监控的主机)配置 设置临时JAVA参数export JAVA_OPTS="-Dcom.s...
  • u012948976
  • u012948976
  • 2016-06-25 21:14
  • 2461

JConsole监控本地windows Tomcat服务

找到下面注册表: x64位置 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\JAVA x32位置 HKE...
  • ok123zxx
  • ok123zxx
  • 2016-09-29 14:03
  • 1531

JConsole(Java 实现Windows 下CMD控制台)

最近有个想法,用Java实现像Windows 下CMD控制台一样,可以进行交互式地运行命令进行操作,今天终于先写了个简单的例子.现将其发布出来与大家分享.代码如下:package jconsole;import java.io.BufferedReader;import java.io.IOExce...
  • savechina
  • savechina
  • 2007-12-29 16:01
  • 4477

通过jdk自带的jconsole.exe监控java程序的性能

在jdk安装目录下如:C:/jdk1.5.0_08/bin有个名为“jconsole.exe”的应用程序,通过它可以检测到java程序当前的运行情况。jconsole控制台界面如下图所示:那么如和配置呢?我们只要打开tomcat,在java标签下添加如下内容:-Dcom.sun.management...
  • cafardhaibin
  • cafardhaibin
  • 2008-04-29 14:27
  • 2678

jconsole远程连接tomcat查看服务器运行情况(jdk1.8+tomcat 8)

在网上查了好久的资料,也成功设置了catalina.sh 文件,可是就是不能链接上,心累啊,折腾了两个小时,所以说还是要看一手的资料,不然会走很多的弯路的。下面就是我设置的步骤: (centos7+jdk8+tomcat 8) 1、vi打开catalina.sh 文件,就是在你tomcat路径下的b...
  • shamoshuizu
  • shamoshuizu
  • 2017-04-24 15:13
  • 1394

mycat 用Jconsole监控mycat压测的各种性能曲线

1,最方便的Mycat监控—JconsoleJDK自带,Windows下图形界面,监控分析Java程序,进入jdk安装目录的bin下面,C:\Program Files\Java\jdk1.7.0_15\bin,双击jconsole.exe打开。  2,去查看后台jmx启动的端口...
  • mchdba
  • mchdba
  • 2016-04-03 13:37
  • 7798
    个人资料
    • 访问:5244473次
    • 积分:38071
    • 等级:
    • 排名:第121名
    • 原创:241篇
    • 转载:35篇
    • 译文:163篇
    • 评论:1576条
    个人微博
    最新评论
    文章存档