秒懂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
可以看到Java JDK 版本为1.8.0_131
- 查看 Java 帮助文档
java -help
- 查看版本和帮助文档
java -showversion
X参数
X参数简介
我们常用的javac
大家都知道是把java代码编译成class文java文件,那么class文件怎么去执行呢?这里用到了三个X参数来说明class文件怎么在虚拟机里面跑起来的。
- -Xint:直接解释执行
- -Xcomp:先编译成本地代码再执行
- -XMixed:混合模式(既有编译执行也有解释执行)
动手实验 2 - 查看和配置X参数
- 查看版本
java -version
在WebIDE的控制台窗口执行java -version后,可以看到我的环境是混合模式执行java程序的。
- 修改编译模式为解释执行模式
java -Xint -version
在WebIDE的控制台窗口执行命令
- 修改编译模式为只编译模式
java -Xcomp -version
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 创建新文件
创建文件名为 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
字节码文件
在 WebIDE 上运行 demoXXparam 代码
java demoXXparam
输出:
hello XX params
在 WebIDE 中新开一个控制台窗口
Terminal->New Terminal
查看所有的运行的java程序,-l 表示打印出class文件的包名
jps -l
发现demoXXparam
进程的id为 518
查看 demoXXparam 程序是否开启了PrintGCDetails这个参数
PrintGCDetails: 在发生垃圾回收时打印内存回收日志,并在进程退出时输出当前内存各区域分配情况
jinfo -flag PrintGCDetails 518
结果如下:
-XX:-PrintGCDetails
上面提到 -
号表示关闭,所以当前 demo 程序没有开启 PrintGCDetails
参数。
动手实验 4 - 开启参数
- 在 WebIDE 控制台强制退出demoXXparam程序
ctrl + c
- 然后清理屏幕
clear
- 然后以参数
-XX:+PrintGCDetails
运行 demoXXparam 程序
java -XX:+PrintGCDetails demoXXparam
- 输出:
hello XX params
查看demoXXparam进程的 id
可以看到demoXXparam进程 id 为 1225
查看 demoXXparam 的配置参数 PrintGCDetails
打开一个新的控制台窗口,执行以下命令来查看进程为 1225 的 PrintGCDetails
参数是否开启
jinfo -flag PrintGCDetails 1225
可以看到PrintGCDetails是开启的,+
号表示开启。
动手实验 5 - Key-Value 类型参数值
查看元空间的值
jinfo -flag MetaspaceSize 526
由此可以得出元空间的大小为 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。
java -XX:MaxHeapSize=200M demoXXparam
或者
java -Xmx200m demoXXparam
查看 MaxHeapSize 参数的值,大小为 200 M。
扩展:查看 Java 程序已设置的所有参数值
jinfo -flags <进程id>
- Non-Defalut VM flags 代表参数类型是JVM自带的参数。
- Command line 代表是用户自定义的参数
如何查看出厂设置和自定义设置的XX配置项
动手实验 7 - 查看出厂默认设置的所有XX配置项
java -XX:+PrintFlagsInitial -version
动手实验 8 - 查看 JVM 当前所有XX配置项
java -XX:+PrintFlagsFinal -version
我们可以看到几个关键信息:
-
[Global flags]
:全局参数,如果自定义修改了某个应用的参数,并不会修改全局参数 比如之前我们修改了MetaspaceSize为128m,但列表里面还是21m。
-
:=
:参数已被修改,如下图所示InitialHeapSize初始化堆内存参数已修改为264241152 总结如下:
动手实验 9 - 运行程序时打印XX配置选项
java -XX:+PrintFlagsFinal -XX:+InitialHeapSize=150M demoXXparam
可以看到修改后的值为 157286400(150 M)
动手实验 10 - 查看 JVM 自动配置的或者用户手动设置的XX选项(非应用程序的)
java -XX:+PrintCommandLineFlags -version
会打印出如下参数:
实验总结
本节实验课学习了如何查看基本参数、X参数、XX参数和设置XX参数。以及用好jps和jinfo工具来查看进程和设置参数。
JVM性能调优 还有很多要讲的,一篇是讲不完的,我会分成几篇来为大家讲述,形式主要以小实验的方式来为大家讲解。
- Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目
- JavaScript中的this详解
- 使用SpringBoot开发REST服务
- CSS3 -webkit-filter 滤镜
- Docker+Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果
- Javascript中的Label语句
- 从编辑距离、BK树到文本纠错
- iframe基本知识及iframe版本Tab切换
- switch语句以及与if的比较
- kgtemp文件转mp3工具
- AJAX原理与步骤
- 【编程基础】C语言FILE结构体以及缓冲区深入探讨
- 获取标签的那些事 之 动态集合
- 一起读源码之zookeeper(1) -- 启动分析
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- SpringBoot使用Mybatis 快速入门
- 【CTR】ESMM:多任务联合学习
- 状态管理之Vuex (三) store利用module拆分
- MySQL 案例:无主键表产生的延迟
- 面试官真的会问:new的实现以及无new实例化
- Android Hilt实战初体验: Dagger替换成Hilt
- Linux系列之学会使用CURL命令
- 潘石屹用python解决100个问题 | 斐波那契数列
- [869]pandas的dataFrame的行列索引操作
- JSP的文件上传处理
- 将SAP CRM WebClient UI的表格导出成PDF
- java.lang.ClassNotFoundException org.w3c.dom.ElementTraversal
- docker一键部署SpringBoot项目
- 【Flutter 专题】95 图解 Dart 单线程实现异步处理之 Task Queue
- 首发基于OpenPAI细化部署 Hadoop 集群