当前位置:首页 > > 架构师社区
[导读]本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本节以实验的方式讲解 JVM 参数的查看和设置,希望大家能有所启发。

来源 | 悟空聊架构(ID:PassJava666)

本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本节以实验的方式讲解 JVM 参数的查看和设置。希望大家能有所启发。

搞懂JVM的三大参数类型,就靠这十个小实验了!

标配参数

常见标配参数

  • -version,获取JDK版本

  • -help,获取帮助

  • -showverision,获取JDK版本和帮助

动手实验 1 - 查看标配参数

实验步骤:

  • 查看Java JDK 版本
java -version
搞懂JVM的三大参数类型,就靠这十个小实验了! 实验 1-1

可以看到Java JDK 版本为1.8.0_131

  • 查看 Java 帮助文档
java -help
搞懂JVM的三大参数类型,就靠这十个小实验了! 实验 1-2
  • 查看版本和帮助文档
java -showversion
搞懂JVM的三大参数类型,就靠这十个小实验了! 实验 1-3

X 参数

X 参数简介

我们常用的javac大家都知道是把java代码编译成 class 文 Java 文件,那么 class 文件怎么去执行呢?这里用到了三个X参数来说明 class 文件怎么在虚拟机里面跑起来的。

  • -Xint:直接解释执行
  • -Xcomp:先编译成本地代码再执行
  • -XMixed:混合模式(既有编译执行也有解释执行)

动手实验 2 - 查看和配置X参数

  • 查看版本
java -version

在WebIDE的控制台窗口执行Java -version 后,可以看到我的环境是混合模式执行java程序的。

搞懂JVM的三大参数类型,就靠这十个小实验了! 实验 2-1
  • 修改编译模式为解释执行模式
java -Xint -version

在WebIDE的控制台窗口执行命令

搞懂JVM的三大参数类型,就靠这十个小实验了! 实验 2-2
  • 修改编译模式为只编译模式
java -Xcomp -version
搞懂JVM的三大参数类型,就靠这十个小实验了! 实验 2-3

XX 参数

XX  参数简介

XX 参数有两种类型,一种是 Boolean 类型,另外一种是键值对类型。

  • Boolean 类型
    • 公式: -XX:+某个属性或者, -XX:-某个属性+表示开启了这个属性,-表示关闭了这个属性。
    • 案例: -XX:-PrintGCDetails,表示关闭了GC详情输出
  • key-value类型
    • 公式: -XX:属性key=属性value
    • 案例: -XX:属性metaspace=2000000,设置Java元空间的值为2000000。

动手实验 3 - 查看参数是否开启

本实验主要讲解如下内容:查看运行的 Java 程序 PrintGCDetails 参数是否开启

  • 编写一个一直运行的 Java 程序
  • 查看该应用程序的进程 id
  • 查看该进程的 GCDetail 参数是否开启

在 WebIDE 上右键单击菜单,选择 New File 创建新文件

搞懂JVM的三大参数类型,就靠这十个小实验了! New File

创建文件名为 demoXXparam.java

搞懂JVM的三大参数类型,就靠这十个小实验了! demoXXparam.java

在 WebIDE 上编写 demoXXparam.java

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

在 WebIDE 的控制台窗口编译 demoXXparam.java 代码

javac demoXXparam.java
搞懂JVM的三大参数类型,就靠这十个小实验了! 编译代码

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

搞懂JVM的三大参数类型,就靠这十个小实验了! 生产Class文件

在 WebIDE 上运行 demoXXparam 代码

java demoXXparam
搞懂JVM的三大参数类型,就靠这十个小实验了! 运行Java程序

输出:

hello XX params

在 WebIDE 中新开一个控制台窗口

Terminal->New Terminal

搞懂JVM的三大参数类型,就靠这十个小实验了! 开启新控制台窗口

查看所有的运行的java程序,-l 表示打印出class文件的包名

jps -l
搞懂JVM的三大参数类型,就靠这十个小实验了! jps

发现demoXXparam进程的id为 518

查看 demoXXparam 程序是否开启了PrintGCDetails这个参数

PrintGCDetails: 在发生垃圾回收时打印内存回收日志,并在进程退出时输出当前内存各区域分配情况

jinfo -flag PrintGCDetails 518
搞懂JVM的三大参数类型,就靠这十个小实验了! jinfo

结果如下:

-XX:-PrintGCDetails

上面提到  -号表示关闭,所以当前 demo 程序没有开启 PrintGCDetails参数。

动手实验 4  - 开启参数

  • 在 WebIDE 控制台强制退出demoXXparam程序
ctrl + c
  • 然后清理屏幕
clear
  • 然后以参数 -XX:+PrintGCDetails运行 demoXXparam 程序
java -XX:+PrintGCDetails demoXXparam
搞懂JVM的三大参数类型,就靠这十个小实验了! 实验 4
  • 输出:
hello XX params

查看demoXXparam进程的 id

搞懂JVM的三大参数类型,就靠这十个小实验了! 进程 id

可以看到demoXXparam进程 id 为 1225

查看 demoXXparam 的配置参数 PrintGCDetails

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

jinfo -flag PrintGCDetails 1225
搞懂JVM的三大参数类型,就靠这十个小实验了! PrintGCDetails 参数

可以看到PrintGCDetails是开启的,+号表示开启。

动手实验 5 - Key-Value 类型参数值

查看元空间的值

jinfo -flag MetaspaceSize 526
搞懂JVM的三大参数类型,就靠这十个小实验了! MetaspaceSize 大小

由此可以得出元空间的大小为 21 M。

设置元空间的值为 128 M

java -XX:MetaspaceSize=128m demoXXparam

查看元空间的大小

jinfo -flag MetaspaceSize 1062
搞懂JVM的三大参数类型,就靠这十个小实验了! 调整元空间大小

最常见的 -Xms 和 -Xmx 属于哪种参数?

  • -Xms参数代表-XX:InitialHeapSize ,初始化堆内存(默认只会用最大物理内存的64分1)
  • -Xmx:参数代表-XX:MaxHeapSize ,大堆内存(默认只会用最大物理内存的4分1)

起了别名,但还是属于XX参数。

动手实验 6 - 设置 -XX:InitialHeapSize 和 -XX:MaxHeapSize 的值。

java -XX:InitialHeapSize=200m demoXXparam
或者
java -Xms200m demoXXparam

查看 InitialHeapSize 参数的值,大小为 200 M。

搞懂JVM的三大参数类型,就靠这十个小实验了! 设置 InitialHeapSize
java -XX:MaxHeapSize=200M demoXXparam
或者
java -Xmx200m demoXXparam

查看 MaxHeapSize 参数的值,大小为 200 M。

搞懂JVM的三大参数类型,就靠这十个小实验了! 设置 MaxHeapSize

扩展:查看 Java 程序已设置的所有参数值

jinfo -flags <进程id>
搞懂JVM的三大参数类型,就靠这十个小实验了! mark
  • Non-Defalut VM flags 代表参数类型是JVM自带的参数。
  • Command line 代表是用户自定义的参数

如何查看出厂设置和自定义设置的XX配置项

动手实验 7 - 查看出厂默认设置的所有XX配置项

java -XX:+PrintFlagsInitial -version
搞懂JVM的三大参数类型,就靠这十个小实验了! PrintFlagsInitial

动手实验 8 - 查看 JVM 当前所有XX配置项

java -XX:+PrintFlagsFinal -version
搞懂JVM的三大参数类型,就靠这十个小实验了! PrintFlagsFinal

我们可以看到几个关键信息:

  • [Global flags]:全局参数,如果自定义修改了某个应用的参数,并不会修改全局参数

    比如之前我们修改了MetaspaceSize为128m,但列表里面还是21m。

搞懂JVM的三大参数类型,就靠这十个小实验了! Global flags
  • :=:参数已被修改,如下图所示InitialHeapSize初始化堆内存参数已修改为264241152

    总结如下:

搞懂JVM的三大参数类型,就靠这十个小实验了! 出厂设置和自定义参数设置

动手实验 9 - 运行程序时打印XX配置选项

java -XX:+PrintFlagsFinal -XX:+InitialHeapSize=150M demoXXparam

可以看到修改后的值为 157286400(150 M)

搞懂JVM的三大参数类型,就靠这十个小实验了! 运行程序时打印XX配置选项

动手实验 10 - 查看 JVM 自动配置的或者用户手动设置的XX选项(非应用程序的)

java -XX:+PrintCommandLineFlags -version

会打印出如下参数:

搞懂JVM的三大参数类型,就靠这十个小实验了! JVM 自动配置的XX选项

实验总结

本节实验课学习了如何查看基本参数、X参数、XX参数和设置XX参数。以及用好jps和jinfo工具来查看进程和设置参数。

JVM性能调优还有很多要讲的,一篇是讲不完的,我会分成几篇来为大家讲述,形式主要以小实验的方式来为大家讲解。


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭