监视工具
JConsole
JConsole 图形用户界面是一种符合 Java 管理扩展 (JMX) 规范的监视工具。JConsole 使用 Java 虚拟机 (Java VM) 的广泛检测来提供有关在 Java 平台上运行的应用程序的性能和资源消耗的信息。
使用方法
本地
-
使用jconsole命令:监视本地运行的所有 Java 应用程序,JConsole 可以连接到这些应用程序。
-
使用jconsole PID命令:监视指定PID的Java应用程序。
获取java PID的方法:通过任务管理器查看、通过Java提供的jps命令查看。
远程
使用jsconsole hostName:portNum
命令:hostName
是运行应用程序的系统的名称,portNum
是您在启动 Java VM
时启用 JMX 代理时指定的端口号。
使用service:jmx:<protocol>:<sap>
命令:使用 JMX 服务 URL 进行连接。
内容分析
将 JConsole 连接到应用程序后,JConsole 由六个选项卡组成。
-
概述:显示有关 Java VM 和受监视值的概述信息。
-
内存:显示有关内存使用的信息。
-
线程:显示有关线程使用的信息。
-
类:显示有关类加载的信息。
-
VM:显示有关 Java VM 的信息。
-
MBeans:显示有关 MBeans 的信息。
组成部分
概览
显示有关 CPU 使用情况、内存使用情况、线程计数和在 Java VM
中加载的类的图形监视信息。
提供有关内存消耗和内存池的信息。
提供执行GC的操作,可以随时点击按钮进行垃圾回收
-
伊甸园空间(堆): 最初为大多数对象分配内存的池。
-
幸存者空间(堆): 包含在伊甸园空间垃圾回收中幸存下来的物体的池。
-
终身代(堆): 包含在幸存者空间中存在一段时间的对象的池。
-
永久生成(非堆): 包含虚拟机本身的所有反射数据的池,如类和方法对象。使用类数据共享的 Java VM,这一代分为只读和读写区域。
-
代码缓存(非堆): HotSpotJava VM 还包括一个代码缓存,其中包含用于编译和存储本机代码的内存。
堆和非堆内存
Java VM
管理两种类型的内存:堆内存和非堆内存,这两种内存都是在 Java VM 启动时创建的。
-
堆内存是
Java VM
为所有类实例和数组分配内存的运行时数据区域。堆的大小可能是固定的或可变的。垃圾回收器是一个自动内存管理系统,用于回收对象的堆内存。 -
非堆内存包括所有线程之间共享的方法区域和
Java VM
的内部处理或优化所需的内存。它存储每类结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码。方法区域在逻辑上是堆的一部分,但是,根据实现,Java VM 可能不会对它进行垃圾回收或压缩。与堆内存一样,方法区域可能为固定大小或可变大小。方法区域的内存不需要连续。
内存池和内存管理器
内存池和内存管理器是 Java VM
内存系统的关键方面。
-
内存池表示
Java VM
管理的内存区域。Java VM
至少有一个内存池,它可能会在执行期间创建或删除内存池。内存池可以属于堆内存或非堆内存。 -
内存管理器管理一个或多个内存池。垃圾回收器是一种内存管理器,负责回收不可到达的对象使用的内存。
Java VM
可能具有一个或多个内存管理器。它可以在执行期间添加或删除内存管理器。内存池可以由多个内存管理器管理。
垃圾回收
垃圾回收 (GC) 是 Java VM
释放不再引用的对象占用的内存的方式。通常认为具有活动引用为"活动"且未引用(或无法访问)对象的对象为"已死"。垃圾回收是释放死对象使用的内存的过程。GC 使用的算法和参数对性能有显著影响。
Java hotspot VM
垃圾回收器使用代数 GC。生成 GC 利用大多数程序符合以下概括的观察。
-
它们创建许多寿命较短的对象,例如迭代器和局部变量。
-
它们创建一些寿命很长的对象,例如高级持久对象。
线程
提供有关线程使用的信息。
-
查找监视器死锁线程: 检测对象监视器锁上是否有任何线程死锁。此操作返回死锁线程指示的数组。
-
getThreadInfo: 返回线程信息。这包括线程当前被阻止的名称、堆栈跟踪和监视器锁(如果有)以及持有该锁的线程以及线程争用统计信息。
-
获取ThreadCpu时间: 返回给定线程消耗的 CPU 时间
类
显示有关类加载的信息。
VM 概要
提供有关 Java VM
的信息。
MBean
以通用方式显示有关在平台 MBean 服务器注册的所有 MBeans 的信息。MBeans 选项卡允许您访问平台 MXBean 检测的完整集,包括在其他选项卡中不可见的仪器。此外,您还可以使用 MBeans 选项卡监视和管理应用程序的 MBeans。