乐趣区

JDK14性能管理工具Jconsole详解

简介

我们在开发 java 项目的时候,或多或少都会去用到 Java 的性能管理工具。有时候是为了提升应用程序的性能,有时候是为了查找 java 应用程序的 bug。

性能监控和调试工具在英文中叫做 profile tool,提起这种工具大家可能会想到一些非常出名的 jprofile 等收费工具,其实 JDK 也自带了一些性能调试工具,比如 JMC 和 Jconsole。

JMC 现在已经和 JDK 的版本独立出来了,详情请参考我之前的文章:JDK 14 的新特性:JFR,JMC 和 JFR 事件流, 今天我们将会重点讲解 Jconsole 的使用。

更多精彩内容且看:

  • 区块链从入门到放弃系列教程 - 涵盖密码学, 超级账本, 以太坊,Libra, 比特币等持续更新
  • Spring Boot 2.X 系列教程: 七天从无到有掌握 Spring Boot- 持续更新
  • Spring 5.X 系列教程: 满足你对 Spring5 的一切想象 - 持续更新
  • java 程序员从小工到专家成神之路(2020 版)- 持续更新中, 附详细文章教程

更多内容请访问 www.flydean.com

JConsole

JConsole 是 JDK 自带的管理工具,在 JAVA_HOME/bin 下面,直接命令 JConsole 即可开启 JConsole。

JConsole 有两种连接方式,一种是连接本地的进程,一种是连接远程的程序。

本地连接是不需要密码的,直接选择相应的 JVM 程序即可。本地连接有一个前提,就是 JConsole 的用户一定要和 java 程序的用户是相同的,否则无法操作 JVM。

远程连接是通过 JMX 协议进行的,JMX 的全称是 Java Management Extention,现在大家做 web 可能对这个协议不太清楚,如果是做客户端程序,接触的应该会多一些。简单点讲,JMX 是用来做远程管理的。程序把要管理的 Bean 暴露出去,然后通过 JMX 协议连接进行操作。

好了,我们连上一个自己写的程序试一下。

概览

JConsole 分为六大部分,概览,内存,线程,类,VM 和 MBean。

先看一下概览:

概览展示了堆内存使用量,线程,类和 CPU 占用率这四大内容。

内存

我们这个程序是使用 JDK14 来启动的,我们看下它的内存情况:

从上图中,我们可以看到使用 JConsole 可以监控堆内存,非堆内存的一些情况,更进一步,还可以监控内存池中的一些项目的使用情况。

G1 垃圾回收器中的 Eden,Old 和 Survivor space 大家应该都很熟悉了。

Young Gen 被划分为 1 个 Eden Space 和 2 个 Suvivor Space。当对象刚刚被创建的时候,是放在 Eden space。垃圾回收的时候,会扫描 Eden Space 和一个 Suvivor Space。如果在垃圾回收的时候发现 Eden Space 中的对象任然有效,则会将其复制到另外一个 Suvivor Space。

就这样不断的扫描,最后经过多次扫描发现任然有效的对象会被放入 Old Gen 表示其生命周期比较长,可以减少垃圾回收时间。

在 JDK8 之前,类定义、字节码和常量等很少会变更的信息是放在持久代 Perm Gen 中的。不过在 JDK8 之后,Perm Gen 已经被取消了,现在叫做 Metaspace。Metaspace 并不在 java 虚拟机中,它使用的是本地内存。Metaspace 可以通过 -XX:MaxMetaspaceSize 来控制。

Code Cache 是 JVM 用来存储 native code 的,因为是用 Heap 的形式来存储的,所以叫 Code Heap。Code Heap 被分为三个部分,Non-method,Profiled 和 Non-profiled。

Non-method 部分包含的是非方法的 code,比如说编译器缓冲区和字节码解释器。这些代码是永久保存在代码缓存区中的。代码堆的大小是固定的。Non-method 使用 -XX:NonMethodCodeHeapSize 来控制。

Profiled 部分表示存的是生命周期比较短的稍微优化的 profiled methods。Profiled 使用–XX:ProfiledCodeHeapSize 来控制。

Non-profiled 存放的是优化过的,non-profiled 方法,并且他们的生命周期会比较长。Non-profiled 用 -XX:NonProfiledCodeHeapSize 来控制。

最后还有一个 Compressed Class Space,它是和 -XX:+UseCompressedOops,-XX:+UseCompressedClassesPointers 有关的。实际上是一个指针的压缩,可以使用 32bits 来表示之前 64bits 的指针。

线程

线程列出了程序目前正在运行的线程,如果点击具体的线程信息还可以看到线程中的堆栈跟踪和线程状态统计,非常有用。

类很简单,显示了加载的类的个数。

VM 信息

VM 信息展示了虚拟机相关的一些参数。

MBean

最后,MBean 暴露了 JVM 中的一些 Bean,我们可以查看这些 bean 的信息或者调用 Bean 中的方法。

以我们之前讲过的 JFR 为例,我们可以调用 JFR 的 startRecording,stopRecording 等方法。

总结

JConsole 是一个比较简单但是也很实用的 profile 工具,希望大家能够在编写代码之余,多多考虑代码的性能和效率。

本文作者:flydean 程序那些事

本文链接:http://www.flydean.com/jdk14-jvm-jconsole/

本文来源:flydean 的博客

欢迎关注我的公众号: 程序那些事,更多精彩等着您!

退出移动版