Win上通过Jconsole查看Java程序资源占用情况(教程总结,一篇就够了)

4 篇文章 0 订阅

最近需要读取一个大文件,为了判断有没有读取到内存中,需要一个能查看jar包占用内存的工具,一顿面向百度后,发现了jdk自带的工具Jconsole,将教程分享给大家

一、介绍

JConsole 是一个内置 Java 性能分析器,Java 5开始 引入了 JConsole。可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole来 监控 Java 应用程序性能跟踪 Java 中的代码

Jconsole工具查看程序的资源占用请求。安装jdk时bin目录有jconsole.exe工具,或者通过 Win + R,输入jconsole.exe启动jconsole( 可以从命令行直接输入jconsole

这款工具的好处在于,占用系统资源少,而且结合Jstat,可以有效监控到java内存的变动情况,以及引起变动的原因。在项目追踪内存泄露问题时,很实用。

二、启动


在这里插入图片描述

三、连接

当分析工具弹出时(取决于正在运行的 Java 版本以及正在运行的 Java 程序数量),可能会出现一个对话框,要求输入一个进程的 URL 来连接,也可能列出许多不同的本地 Java 进程(有时包含 JConsole 进程本身)来连接。如图所示:
在这里插入图片描述
想分析哪个程序就双击那个进程。
在这里插入图片描述
在这里插入图片描述

此时,就可以看到资源占用情况,实现了最基本的功能,如果想了解远程连接,以及界面详情,可以往下看在这里插入图片描述

1、设置JAVA程序运行时可以被JConsolse连接分析

  1. 本地程序(相对于开启JConsole的计算机),无需设置任何参数就可以被本地开启的JConsole连接(Java SE 6开始无需设置,之前还是需要设置运行时参数 -Dcom.sun.management.jmxremote )
  2. 无认证连接 (下面的设置表示:连接的端口为8999、无需认证就可以被连接
  3. 参考:Monitoring and Management Using JMX Technology - Java SEMonitoring and Management Guide

四、界面展示

在连接上Java应用程序后便可以查看应用程序的概况,如图所示。图中4张折线图分别显示了堆内存的使用情况、系统的线程数量、加载类的数量及CPU的使用率。

一般主要关注内存栏线程栏类栏概述栏VM栏次之,MBeans栏在追踪具体问题时用到。

值得一提的是对着图点击右键可以保存数据到CSV文件,以后可以使用其他工具来分析这些数据。

随时可以使用JConsole的在右上角的绿色连接状态图标,断开或重新连接到正在运行的Java虚拟机。 从下拉菜单中选择连接,然后新建连接,您可以同时连接到任何数量运行中的Java虚拟机。

在这里插入图片描述

1、内存监控

在JConsole中,可以查看堆的详细信息,包括堆的大小、使用率、eden区大小、survivor区大小及永久区大小等。

切换到“内存”选项卡,JConsole可以显示当前内存的详细信息。这里不仅包括堆内存的整体信息,更细化到了eden区、survivior区及老年代的使用情况,同时也包括非堆区,即永久代的使用情况。单击右上角的“执行GC”按钮,可以强制应用程序进行一次FullGC操作,如图所示。
在这里插入图片描述
堆和非堆内存

Java虚拟机管理两种内存:堆和非堆内存,这两者都是Java虚拟机启动时创建的。

  1. 堆内存是运行时数据区域,Java VM的所有类实例和数组分配内存。 可能是固定或可变大小的堆。
  2. 非堆内存包括在所有线程和Java虚拟机内部处理或优化所需的共享的方法。 它存储了类的结构,运行常量池,字段和方法数据,以及方法和构造函数的代码,方法区在逻辑上是堆的一部分,看具体实现的方式。根据实现方式的不同,Java虚拟机可能不进行垃圾收集或压缩。 堆内存一样,方法区域可能是一个固定或可变大小。 方法区的内存不需要是连续的。
  3. 除了方法区,Java虚拟机可能需要进行内部处理或优化,这也属于非堆内存的内存。 例如,实时(JIT)编译器需要内存用于存储从Java虚拟机的高性能的代码翻译的机器码。

2、线程监控

使用JConsole可以方便地查看系统内的线程信息,并且可以快速地定位死锁问题。

JConsole中的“线程”选项卡允许开发人员监控程序内的线程,如图所示。JConsole显示了系统内的线程数量,并在屏幕下方显示了程序中所有的线程。单击线程名称,便可以查看线程的栈信息。(如果线程过多,可以在下面的过滤栏中输入字符串过滤出你想要观察的线程)

统计图显示的是线程数目的峰值(红色)和当前活动的线程(蓝色)。

线程选项卡提供了几个有用的操作。

findMonitorDeadlockedThreads:检测,如果任何线程对象监视器锁定陷入死锁。 此操作返回一个死锁的线程ID数组。
getThreadInfo:返回线程的信息。 这包括名称,堆栈跟踪和监测锁,该线程目前已封锁,如果有的话,哪个线程持有该锁,以及线程争用统计。
getThreadCpuTime:返回给定的线程所消耗的CPU时间
在这里插入图片描述

单击“检测死锁”按钮,还可以自动检测多线程应用程序的死锁情况。

3、类加载情况

JConsole的“类”选项卡如图所示,显示了系统已经装载的类数量,在“详细信息”栏中,还显示了已卸载的类数量。

在这里插入图片描述

4、虚拟机信息

VM摘要显示了当前Java应用程序的基本信息,如虚拟机类型、虚拟机版本、系统的线程信息、操作系统的内存信息、堆信息、垃圾回收器的类型、JVM参数及类路径等。

在“VM摘要”选项卡中,JConsole显示了当前应用程序的运行环境,包括虚拟机类型、版本、堆信息及虚拟机参数等,如图所示。
在这里插入图片描述

5、MBean管理

通过JConsole,可以对Java应用程序中的Mbean进行统一管理。

MBean选项卡允许通过JConsole进行MBean管理,包括查看或者设置MBean的属性,以及运行MBean的方法等。如图示为MBean的管理界面,这里选中了Memory的Verbose属性。通过修改Verbose的属性值,可以在程序运行时动态打开或者关闭GC操作的输出信息。
在这里插入图片描述
MBean的种类繁多,功能也比较强大,列举几个常用的MBean操作,
在这里插入图片描述

6、使用插件

除了基本功能外,JConsole还支持插件扩展。在JDK的安装目录下就有一个自带的JConsole插件,它位于%JAVA_HOME%\demo\management\JTop下。使用以下命令可以让JConsole加载插件并启动:
在这里插入图片描述
JConsole启动后,连接到任意Java应用程序,便可以进入JTop页面,如图所示。

JTop插件按照CPU占用时间进行排序,将占用CPU时间最长的线程显示在表格顶端。通过这个插件,开发人员便能迅速地找到占用CPU时间最长的线程名称,并通过线程快照定位线程代码。
在这里插入图片描述

JTop插件的完整源代码都可以在JDK的安装目录下找到,有兴趣的读者可以修改JTop的源码,让它显示更多的线程信息。

参考链接

  1. JConsole详解:https://blog.csdn.net/D420941934/article/details/120473194
  2. 通过Java查看程序资源占用情况:https://www.jb51.cc/java/3556429.html
  3. jconsole工具使用: https://www.cnblogs.com/kongzhongqijing/articles/3621441.html
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值