前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >秒懂JVM的三大参数类型,就靠这十个小实验了

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

作者头像
悟空聊架构
发布2020-09-17 17:22:31
5260
发布2020-09-17 17:22:31
举报
文章被收录于专栏:悟空聊架构 | 公众号
封面
封面

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

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

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

目录
目录

标配参数

常见标配参数

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

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

实验步骤:

  • 查看Java JDK 版本
代码语言:javascript
复制
java -version
实验 1-1
实验 1-1

可以看到Java JDK 版本为1.8.0_131

  • 查看 Java 帮助文档
代码语言:javascript
复制
java -help
实验 1-2
实验 1-2
  • 查看版本和帮助文档
代码语言:javascript
复制
java -showversion
实验 1-3
实验 1-3

X参数

X参数简介

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

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

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

  • 查看版本
代码语言:javascript
复制
java -version

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

实验 2-1
实验 2-1
  • 修改编译模式为解释执行模式
代码语言:javascript
复制
java -Xint -version

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

实验 2-2
实验 2-2
  • 修改编译模式为只编译模式
代码语言:javascript
复制
java -Xcomp -version
实验 2-3
实验 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
New File
创建文件名为 demoXXparam.java
demoXXparam.java
demoXXparam.java
在 WebIDE 上编写 demoXXparam.java
代码语言:javascript
复制
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 代码
代码语言:javascript
复制
javac demoXXparam.java 
编译代码
编译代码

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

生产Class文件
生产Class文件
在 WebIDE 上运行 demoXXparam 代码
代码语言:javascript
复制
java demoXXparam
运行Java程序
运行Java程序

输出:

代码语言:javascript
复制
hello XX params

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

Terminal->New Terminal

开启新控制台窗口
开启新控制台窗口
查看所有的运行的java程序,-l 表示打印出class文件的包名
代码语言:javascript
复制
jps -l
jps
jps

发现demoXXparam进程的id为 518

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

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

代码语言:javascript
复制
jinfo -flag PrintGCDetails 518
jinfo
jinfo

结果如下:

代码语言:javascript
复制
-XX:-PrintGCDetails

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

动手实验 4 - 开启参数

  • 在 WebIDE 控制台强制退出demoXXparam程序
代码语言:javascript
复制
ctrl + c
  • 然后清理屏幕
代码语言:javascript
复制
clear
  • 然后以参数 -XX:+PrintGCDetails 运行 demoXXparam 程序
代码语言:javascript
复制
java -XX:+PrintGCDetails demoXXparam
实验 4
实验 4
  • 输出:
代码语言:javascript
复制
hello XX params
查看demoXXparam进程的 id
进程 id
进程 id

可以看到demoXXparam进程 id 为 1225

查看 demoXXparam 的配置参数 PrintGCDetails

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

代码语言:javascript
复制
jinfo -flag PrintGCDetails 1225
PrintGCDetails 参数
PrintGCDetails 参数

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

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

查看元空间的值
代码语言:javascript
复制
jinfo -flag MetaspaceSize 526
MetaspaceSize 大小
MetaspaceSize 大小

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

设置元空间的值为 128 M
代码语言:javascript
复制
java -XX:MetaspaceSize=128m demoXXparam   

查看元空间的大小

代码语言:javascript
复制
    jinfo -flag MetaspaceSize 1062
调整元空间大小
调整元空间大小

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

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

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

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

代码语言:javascript
复制
java -XX:InitialHeapSize=200m demoXXparam
或者
java -Xms200m demoXXparam

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

设置 InitialHeapSize
设置 InitialHeapSize
代码语言:javascript
复制
java -XX:MaxHeapSize=200M demoXXparam
或者
java -Xmx200m demoXXparam

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

设置 MaxHeapSize
设置 MaxHeapSize

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

代码语言:javascript
复制
jinfo -flags <进程id>
mark
mark
  • Non-Defalut VM flags 代表参数类型是JVM自带的参数。
  • Command line 代表是用户自定义的参数

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

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

代码语言:javascript
复制
java -XX:+PrintFlagsInitial -version 
PrintFlagsInitial
PrintFlagsInitial

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

代码语言:javascript
复制
java -XX:+PrintFlagsFinal -version 
PrintFlagsFinal
PrintFlagsFinal

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

  • [Global flags]:全局参数,如果自定义修改了某个应用的参数,并不会修改全局参数 比如之前我们修改了MetaspaceSize为128m,但列表里面还是21m。
Global flags
Global flags
  • :=:参数已被修改,如下图所示InitialHeapSize初始化堆内存参数已修改为264241152 总结如下:
出厂设置和自定义参数设置
出厂设置和自定义参数设置

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

代码语言:javascript
复制
java -XX:+PrintFlagsFinal -XX:+InitialHeapSize=150M demoXXparam

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

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

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

代码语言:javascript
复制
java -XX:+PrintCommandLineFlags -version

会打印出如下参数:

JVM 自动配置的XX选项
JVM 自动配置的XX选项

实验总结

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 秒懂JVM的三大参数类型,就靠这十个小实验了
    • 标配参数
      • 常见标配参数
      • 动手实验 1 - 查看标配参数
    • X参数
      • X参数简介
      • 动手实验 2 - 查看和配置X参数
    • XX 参数
      • XX参数简介
      • 动手实验 3 - 查看参数是否开启
      • 在 WebIDE 中新开一个控制台窗口
      • 动手实验 4 - 开启参数
      • 动手实验 5 - Key-Value 类型参数值
    • 最常见的 -Xms 和 -Xmx 属于哪种参数?
      • 动手实验 6 - 设置 -XX:InitialHeapSize 和 -XX:MaxHeapSize 的值。
      • 扩展:查看 Java 程序已设置的所有参数值
    • 如何查看出厂设置和自定义设置的XX配置项
      • 动手实验 7 - 查看出厂默认设置的所有XX配置项
      • 动手实验 8 - 查看 JVM 当前所有XX配置项
      • 动手实验 9 - 运行程序时打印XX配置选项
      • 动手实验 10 - 查看 JVM 自动配置的或者用户手动设置的XX选项(非应用程序的)
    • 实验总结
    相关产品与服务
    云开发 CloudBase
    云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档