最近需要读取一个大文件,为了判断有没有读取到内存中,需要一个能查看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连接分析
- 本地程序(相对于开启JConsole的计算机),无需设置任何参数就可以被本地开启的JConsole连接(Java SE 6开始无需设置,之前还是需要设置运行时参数 -Dcom.sun.management.jmxremote )
- 无认证连接 (下面的设置表示:连接的端口为8999、无需认证就可以被连接
- 参考: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虚拟机启动时创建的。
- 堆内存是运行时数据区域,Java VM的所有类实例和数组分配内存。 可能是固定或可变大小的堆。
- 非堆内存包括在所有线程和Java虚拟机内部处理或优化所需的共享的方法。 它存储了类的结构,运行常量池,字段和方法数据,以及方法和构造函数的代码,方法区在逻辑上是堆的一部分,看具体实现的方式。根据实现方式的不同,Java虚拟机可能不进行垃圾收集或压缩。 堆内存一样,方法区域可能是一个固定或可变大小。 方法区的内存不需要是连续的。
- 除了方法区,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的源码,让它显示更多的线程信息。
参考链接
- JConsole详解:https://blog.csdn.net/D420941934/article/details/120473194
- 通过Java查看程序资源占用情况:https://www.jb51.cc/java/3556429.html
- jconsole工具使用: https://www.cnblogs.com/kongzhongqijing/articles/3621441.html