JVM技术专题精心准备了一套JVM分析工具的锦囊「JConsole补充篇」
Posted 浩宇の天尚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM技术专题精心准备了一套JVM分析工具的锦囊「JConsole补充篇」相关的知识,希望对你有一定的参考价值。
前提概要
本篇文章主要针对于之前本系列文章的补充版,之前落下了Jconsole分析工具,所以为了了却这个遗憾,所以小编又开了这篇文章,主要针对于Jconsole工具进行相关的应用性能分析。
初识JConsole
-
【Jconsole(Java Monitoring and Management Console),内存监控管理控制台】
-
Jconsole是JDK自带的内置应用监控和性能分析工具,在%JAVA_HOME%/bin目录下可以找到jconsole的可执行文件。
-
Jconsole可以实现连接远程应用程序和本地程序应用,也可以同时监控几个jvm。
-
Jconsole可以运行在java应用程序的资源消耗和性能进行监控,并统计计算相关图形报表,提供强大的可视化界面。
-
Jconsole本身占用的服务器内存很小,甚至可以说几乎不消耗。
-
它用于对JVM中内存,线程和类等的监控。可使用JTop插件。
-
而且结合Jstat,可以有效监控到java内存的变动情况,以及引起变动的原因。在项目追踪内存泄露问题时,很实用。
-
JConsole进行工作
分析器有自己的开销,因此最好的办法就是花点时间来弄清是什么开销。发现JConsole开销最简单的办法是,首先独自运行一个应用程序,然后在分析器下运行,并测量差异。
-
使用 -verbose:gc 尝试运行SwingSet2来查看垃圾收集清理,然后运行同一个应用程序并将JConsole分析器连接到它。
-
当JConsole连接好了之后,一个稳定的 GC 清理流出现,否则不会出现。这就是分析器的性能开销。
Jconsole本地监控
- 点击可执行文件(windows)
- 启动命令服务
jconsole [ -interval=n ] [ -notile ] [ -pluginpath <path> ] [ -version ] [ connection ... ]
-interval 将更新间隔设置为 n 秒 (默认值为 4 秒)
-notile 初始不平铺窗口 (对于两个或多个连接)
-pluginpath 指定 jconsole 用于查找插件的路径
-version 输出程序版本
connection = pid || host:port || JMX URL (service:jmx:<协议>://...)
pid 目标进程的进程 ID
host 远程主机名或 IP 地址
port 远程连接的端口号
-J 指定运行 jconsole 的 Java 虚拟机
的输入参数
- 访问页面
JConsole查看当前程序/进程的全局情况
JConsole 基本包括以下基本功能:概述、内存、线程、类、VM概要、MBean
单独查看内存使用情况和GC回收情况
内存页签相对于可视化的jstat 命令,用于监视受收集器管理的虚拟机内存。
“内存”选项卡具有“执行GC”按钮,可以随时单击该按钮以执行垃圾回收。
该图表显示了Java VM随时间的内存使用情况,堆和非堆内存以及特定内存池的内存使用情况。
Java VM管理两种内存:堆内存和非堆内存,这两种内存都是在Java VM启动时创建的。
(1)堆内存是运行时数据区,Java VM从中为所有类实例和数组分配内存。堆可以是固定的或可变的大小。垃圾收集器是一个自动内存管理系统,可回收对象的堆内存。
Eden Space:
伊甸区,对象被创建的时候首先放到Eden Space,进行垃圾回收后,不能被回收的对象被放入到空的Survivor区域
Survivor Space:
幸存者区,用于保存在eden space内存区域中经过垃圾回收后没有被回收的对象
Survivor Space分为两个空间大小一样的区域,分别是To Survivor和From Survivor,并且始终保持一个Survivor是空的
Eden Space和Survivor Space都属于新生代
对新生代 进行垃圾回收被称为Minor GC(或Young GC),每一次Minor GC后留下来的对象age(就是用来判断对象是否进入老年的标志)加1
Old Gen:
老年代,用于存放新生代中经过多次垃圾回收仍然存活的对象,也有可能是新生代分配不了内存的大对象会直接进入老年代。
经过多次垃圾回收都没有被回收的对象,这些对象的age已经足够old了,就会放入到老年代。
当老年代被放满之后,虚拟机会进行垃圾回收,称之为Major GC。由于Major GC除并发GC外均需对整个堆进行扫描和回收,因此又称为Full GC
默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。
查看程序中线程的情况
如果上面的“内存”页签相当于可视化的jstat命令的话,“线程”页签的功能相当于可视化的jstack命令,遇到线程停顿时可以使用这个页签进行监控分析。线程长时间停顿的主要原因主要有:等待外部资源(数据库连接、网络资源、设备资
源等)、死循环、锁等待(活锁和死锁)
单独查看程序中类的加载和卸载情况
查看VM的概要情况以及相关运行参数
显示了所有在platform. MBeanserver上注册的MBeans的信息
Jconsole远程监控
Web应用程序分析工具假设通过一个套接字进行连通性分析,只需要进行少许配置来设置 JConsole(或者是基于 JVMTI 的分析器,就这点而言),监控/分析远程运行的应用程序。
JVM增加如下启动参数
-Djava.rmi.server.hostname=外网ip地址
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.local.only=false
配置权限文件
如果连接需要帐号和密码的话,加上这一步配置。
[root@localhost management]# pwd
/usr/local/src/jdk1.8.0_131/jre/lib/management
[root@localhost management]# ls
jmxremote.access jmxremote.password jmxremote.password.template management.properties snmp.acl.template
[root@localhost management]# cp jmxremote.password.template jmxremote.password
[root@localhost management]# vim jmxremote.password
对于jmxremote.password,将其中的:
#monitorRole QED
#controlRole R&D
井号注释取消掉。其中monitorRole为只拥有只读权限的角色,controlRole有更高权限:读写等等。当然,也可以设置自己个性化的帐号密码。
然后配置权限文件为600
[root@localhost management]# chmod 600 jmxremote.password jmxremote.access
3)加入参数
-D com.sun.management.jmxremote.pwd.file=/usr/local/src/jdk1.8.0_131/jre/lib/management/jmxremote.password"
并修改下面的配置为true
-Dcom.sun.management.jmxremote.authenticate=true
连接失败的问题
- 1)关闭防火墙
- 2)hostname的问题:请将127.0.0.1修改为本地真实的IP(这个问题我没有遇到)
[root@localhost management]# vim /etc/hosts
192.168.1.12 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
以上是关于JVM技术专题精心准备了一套JVM分析工具的锦囊「JConsole补充篇」的主要内容,如果未能解决你的问题,请参考以下文章
JVM技术专题精心准备了一套JVM分析工具的锦囊「JConsole补充篇」
JVM调优工具锦囊:JDK自带工具与Arthas线上分析工具对比