首页 > 自考资讯 > 自考知识

jdk自带的jvm调优工具,jdk11 性能提升

头条共创 2024-07-05

简介

当您开发Java项目时,您或多或少会使用Java性能管理工具。有时是为了提高应用程序性能,有时是为了查找Java 应用程序中的bug。

性能监控和调试工具英文称为profiling tools。当您想到此类工具时,您可能会想到非常流行的付费工具,例如jprofile。其实JDK还自带了JMC、JMC等几种性能调试工具。 J 控制台。

JConsole

JConsole 是JDK 附带的管理工具。您可以直接在JAVA_HOME/bin 中命令来打开JConsole。

f49230b3035b4483af6d0f4e6e853774~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720751631&x-signature=V3FqKLNoEdw%2F%2FcJo%2FjPWANpNSVo%3D

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

本地连接不需要密码。只需选择相应的JVM程序即可。本地连接的前提是JConsole用户必须与Java程序用户相同。否则,JVM无法运行。

远程连接通过JMX 协议执行。 JMX 的正式名称是Java 管理扩展。如果您使用的是客户端程序,您可能不熟悉这个协议。接触它。简单来说,JMX就是用来进行远程管理的。该程序公开托管bean并通过JMX协议连接它们以进行操作。

现在,让我们用我们创建的程序来尝试一下。

概览

JConsole 分为六个部分:概述、内存、线程、类、VM 和MBean。

首先,让我们看一下概述。

c7d1d7209b3f4ffca674457e89d1707f~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720751631&x-signature=1cnoPDKJTihrNDp7cig%2B3J%2FNVcc%3D

摘要显示了四个主要内容:堆内存使用情况、线程、类和CPU 使用情况。

内存

程序使用JDK14 启动。我们来看看那段记忆。

f75807aa119b43dc848b3b0fcc85ea04~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720751631&x-signature=uw%2BW6ibdEwYeUYZpVsAEFim3qsw%3D

从上图可以看出,可以使用JConsole来监控堆内存和部分非堆内存的状态。另外,还可以监控内存池中某些项目的使用情况。

大家应该都很熟悉G1垃圾收集器中的Eden、Old、Survivor空间。

Young Gen分为1个Eden空间和2个Survivor空间。当一个对象第一次创建时,它被放置在Eden 空间中。在垃圾收集期间,会扫描Eden 空间和Survivor 空间。如果垃圾回收期间发现Eden Space 中的对象仍然有效,则将其复制到另一个Survivor Space。

就这样不断地扫描,经过多次扫描,仍然有效的对象最终会被放入Old Gen中。这意味着对象具有相对较长的生命周期,可以减少垃圾收集时间。

在JDK8之前,很少更改的信息,例如类定义、字节码和常量,被放置在持久生成的Perm Gens中。然而,从JDK8 开始,Perm Gen 已被弃用,现在称为Metaspace。元空间不位于Java 虚拟机内并使用本地内存。元空间可以通过-XX:MaxMetaspaceSize 进行控制。

代码缓存被JVM用来存储本机代码,因为以堆的形式存储,所以被称为代码堆。代码堆分为三部分:非方法、分析和非分析。

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

分析部分意味着存储稍微优化的、生命周期相对较短的分析方法。 Profiled 使用XX:ProfiledCodeHeapSize 进行控制。

非配置文件存储优化的非配置文件方法,并且具有更长的生命周期。非分析由-XX:NonProfiledCodeHeapSize 控制。

最后,还有与-XX:+UseCompressedOops 和-XX:+UseCompressedClassesPointers 关联的压缩类空间。这实际上是一种指针压缩,允许您使用32 位来表示以前的64 位指针。

线程

4df74e9d998b4a99a45143bb2ad82bec~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720751631&x-signature=aOoznuDVLTcEsS5aGZFrCtK81vo%3D

线程列出了程序中当前正在运行的线程。单击特定线程信息还会显示该线程内的堆栈跟踪和线程状态统计信息,这非常有用。

Class很简单,表示加载的类的数量。

d27e129c7fca467ebb04579f8c818d4d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720751631&x-signature=1udOii5L6BM%2BfOnYSVMQJihrunE%3D

VM信息

62f676d1aabc474a8da0d21f3e85fcd8~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720751631&x-signature=v1foz0S57Xm8j0c7gfci88xTTr8%3D

VM信息显示与虚拟机相关的几个参数。

MBean

最后,MBean 在JVM 中公开一些bean,并允许您查看有关这些bean 的信息并调用它们的方法。

a1f8319ebc40484d969bea3ac25a1340~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720751631&x-signature=mTXHq%2BRzjA63XSIIx%2BbbOpTzKT0%3D

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

总结

JConsole 是一个相对简单但非常有用的分析工具。我们希望您在编写代码时考虑代码的性能和效率。

作者:弗雷丁

链接:https://juejin.im/post/5ed035e9e51d4578671690df

版权声明:本文转载于今日头条,版权归作者所有。如有侵权,请联系本站编辑删除。

猜你喜欢