首页 > 数据库 > 数据库开发技术 > 秒懂JVM的三大参数类型,就靠这十个小实验了

这是我的第 59 篇原创文章
作者 | 悟空哥
来源 | 悟空聊架构(ID:PassJava666)
❝你好,我是
❞悟空哥,「7年项目开发经验,全栈工程师,开发组长,超喜欢图解编程底层原理」。手写了2个小程序,Java刷题小程序,PMP刷题小程序,已发布到我的公众号菜单。
本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本节以实验的方式讲解 JVM 参数的查看和设置。希望大家能有所启发。

-version,获取JDK版本
-help,获取帮助
-showverision,获取JDK版本和帮助
实验步骤:
java -version

可以看到Java JDK 版本为1.8.0_131
java -help

java -showversion

我们常用的javac大家都知道是把java代码编译成 class 文 Java 文件,那么 class 文件怎么去执行呢?这里用到了三个X参数来说明 class 文件怎么在虚拟机里面跑起来的。
java -version
在WebIDE的控制台窗口执行Java -version 后,可以看到我的环境是混合模式执行java程序的。

java -Xint -version
在WebIDE的控制台窗口执行命令

java -Xcomp -version

XX 参数有两种类型,一种是 Boolean 类型,另外一种是键值对类型。
-XX:+某个属性 或者,-XX:-某个属性 +表示开启了这个属性,-表示关闭了这个属性。-XX:-PrintGCDetails,表示关闭了GC详情输出-XX:属性key=属性value-XX:属性metaspace=2000000,设置Java元空间的值为2000000。本实验主要讲解如下内容:查看运行的 Java 程序 PrintGCDetails 参数是否开启


public class demoXXparam {
public static void main(String[] args) throws InterruptedException {
System.out.println("hello XX params");
Thread.sleep(Integer.MAX_VALUE);
}
}
javac demoXXparam.java

编译之后,会在当前文件夹产生我们所编写的 demoXXparam 类的 demoXXparam.class 字节码文件

java demoXXparam

输出:
hello XX params
Terminal->New Terminal

jps -l

发现demoXXparam进程的id为 518
PrintGCDetails: 在发生垃圾回收时打印内存回收日志,并在进程退出时输出当前内存各区域分配情况
jinfo -flag PrintGCDetails 518

结果如下:
-XX:-PrintGCDetails
上面提到 -号表示关闭,所以当前 demo 程序没有开启 PrintGCDetails参数。
ctrl + c
clear
-XX:+PrintGCDetails 运行 demoXXparam 程序java -XX:+PrintGCDetails demoXXparam

hello XX params

可以看到demoXXparam进程 id 为 1225
打开一个新的控制台窗口,执行以下命令来查看进程为 1225 的 PrintGCDetails参数是否开启
jinfo -flag PrintGCDetails 1225

可以看到PrintGCDetails是开启的,+号表示开启。
jinfo -flag MetaspaceSize 526

由此可以得出元空间的大小为 21 M。
java -XX:MetaspaceSize=128m demoXXparam
查看元空间的大小
jinfo -flag MetaspaceSize 1062

起了别名,但还是属于XX参数。
java -XX:InitialHeapSize=200m demoXXparam
或者
java -Xms200m demoXXparam
查看 InitialHeapSize 参数的值,大小为 200 M。

java -XX:MaxHeapSize=200M demoXXparam
或者
java -Xmx200m demoXXparam
查看 MaxHeapSize 参数的值,大小为 200 M。

jinfo -flags <进程id>

java -XX:+PrintFlagsInitial -version

java -XX:+PrintFlagsFinal -version

我们可以看到几个关键信息:
[Global flags]:全局参数,如果自定义修改了某个应用的参数,并不会修改全局参数
比如之前我们修改了MetaspaceSize为128m,但列表里面还是21m。

:=:参数已被修改,如下图所示InitialHeapSize初始化堆内存参数已修改为264241152
总结如下:

java -XX:+PrintFlagsFinal -XX:+InitialHeapSize=150M demoXXparam
可以看到修改后的值为 157286400(150 M)

java -XX:+PrintCommandLineFlags -version
会打印出如下参数:

本节实验课学习了如何查看基本参数、X参数、XX参数和设置XX参数。以及用好jps和jinfo工具来查看进程和设置参数。
JVM性能调优还有很多要讲的,一篇是讲不完的,我会分成几篇来为大家讲述,形式主要以小实验的方式来为大家讲解。
- END -

❝你好,我是
❞悟空哥,「7年项目开发经验,全栈工程师,开发组长,超喜欢图解编程底层原理」。手写了2个小程序,Java刷题小程序,PMP刷题小程序,点击我的公众号菜单打开!另外有111本架构师资料以及1000道Java面试题,都整理成了PDF,可以关注公众号 「悟空聊架构」 回复悟空领取优质资料。
「转发->在看->点赞->收藏->评论!!!」 是对我最大的支持!
更多内容

点亮,服务器三年不宕机
原文作者:悟空聊架构;如有侵权,请联系管理员删除。