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


    封面

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

    你好,我是悟空哥,「7年项目开发经验,全栈工程师,开发组长,超喜欢图解编程底层原理」。手写了2个小程序,Java刷题小程序,PMP刷题小程序,已发布到公众号菜单。
    SpringCloud实战项目Github
    Java在线文档Github

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

    目录

    标配参数

    常见标配参数

    • -version,获取JDK版本

    • -help,获取帮助

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

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

    实验步骤:

    • 查看Java JDK 版本
    java -version
    

    实验 1-1

    可以看到Java JDK 版本为1.8.0_131

    • 查看 Java 帮助文档
    java -help
    

    实验 1-2

    • 查看版本和帮助文档
    java -showversion
    

    实验 1-3

    X参数

    X参数简介

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

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

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

    • 查看版本
    java -version
    

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

    实验 2-1

    • 修改编译模式为解释执行模式
    java -Xint -version
    

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

    实验 2-2

    • 修改编译模式为只编译模式
    java -Xcomp -version
    

    实验 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 创建新文件

    New File

    创建文件名为 demoXXparam.java

    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 
    

    编译代码

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

    生产Class文件

    在 WebIDE 上运行 demoXXparam 代码

    java demoXXparam
    

    运行Java程序

    输出:

    hello XX params
    

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

    Terminal->New Terminal

    开启新控制台窗口

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

    jps -l
    

    jps

    发现demoXXparam进程的id为 518

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

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

    jinfo -flag PrintGCDetails 518
    

    jinfo

    结果如下:

    -XX:-PrintGCDetails
    

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

    动手实验 4 - 开启参数

    • 在 WebIDE 控制台强制退出demoXXparam程序
    ctrl + c
    
    • 然后清理屏幕
    clear
    
    • 然后以参数 -XX:+PrintGCDetails 运行 demoXXparam 程序
    java -XX:+PrintGCDetails demoXXparam
    

    实验 4

    • 输出:
    hello XX params
    

    查看demoXXparam进程的 id

    进程 id

    可以看到demoXXparam进程 id 为 1225

    查看 demoXXparam 的配置参数 PrintGCDetails

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

    jinfo -flag PrintGCDetails 1225
    

    PrintGCDetails 参数

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

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

    查看元空间的值

    jinfo -flag MetaspaceSize 526
    

    MetaspaceSize 大小

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

    设置元空间的值为 128 M

    java -XX:MetaspaceSize=128m demoXXparam   
    

    查看元空间的大小

        jinfo -flag MetaspaceSize 1062
    

    调整元空间大小

    最常见的 -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。

    设置 InitialHeapSize

    java -XX:MaxHeapSize=200M demoXXparam
    或者
    java -Xmx200m demoXXparam
    

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

    设置 MaxHeapSize

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

    jinfo -flags <进程id>
    

    mark

    • Non-Defalut VM flags 代表参数类型是JVM自带的参数。
    • Command line 代表是用户自定义的参数

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

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

    java -XX:+PrintFlagsInitial -version 
    

    PrintFlagsInitial

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

    java -XX:+PrintFlagsFinal -version 
    

    PrintFlagsFinal

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

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

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

    Global flags

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

      总结如下:

    出厂设置和自定义参数设置

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

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

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

    运行程序时打印XX配置选项

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

    java -XX:+PrintCommandLineFlags -version
    

    会打印出如下参数:

    JVM 自动配置的XX选项

    实验总结

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

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

    资料


    你好,我是悟空哥「7年项目开发经验,全栈工程师,开发组长,超喜欢图解编程底层原理」
    我还手写了2个小程序,Java刷题小程序,PMP刷题小程序,点击我的公众号菜单打开!
    另外有111本架构师资料以及1000道Java面试题,都整理成了PDF,可以关注公众号 「悟空聊架构」 回复 悟空 领取优质资料。

    「转发->在看->点赞->收藏->评论!!!」 是对我最大的支持!

    二维码

  • 相关阅读:
    大数据学习总结(7)we should...
    大数据学习总结(6)what is our foucus
    洛谷P4632 [APIO2018] New Home 新家(动态开节点线段树 二分答案 扫描线 set)
    BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)
    BZOJ2438: [中山市选2011]杀人游戏(tarjan)
    cf1072D. Minimum path(BFS)
    cf1072B. Curiosity Has No Limits(枚举)
    cf567E. President and Roads(最短路计数)
    六校联考考试反思
    BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)
  • 原文地址:https://www.cnblogs.com/jackson0714/p/jvm_performance1.html
Copyright © 2020-2023  润新知