秒懂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性能调优 还有很多要讲的,一篇是讲不完的,我会分成几篇来为大家讲述,形式主要以小实验的方式来为大家讲解。
秒懂JVM的三大参数类型,就靠这十个小实验了的更多相关文章
- [JVM教程与调优] JVM都有哪些参数类型?
		
JDK本身是提供了一些监控工具,有一些是命令行,也有图形界面.本次介绍命令行如何进行监控. 命令行是非常重要的,因为在我们生产环境基本上是没有图形界面的,完全是通过命令行. 主要内容: JVM的参数类 ...
 - JVM探秘:JVM的参数类型
		
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. JVM的参数类型,大致可以分为标准参数.X参数.XX参数,而XX参数又可以分为Bool ...
 - MySql学习 (一) —— 基本数据库操作语句、三大列类型
		
注:该MySql系列博客仅为个人学习笔记. 在使用MySql的时候,基本都是用图形化工具,如navicat.最近发现连最基本的创建表的语法都快忘了... 所以,想要重新系统性的学习下MySql,为后面 ...
 - JVM调优系列:(五)JVM常用调试参数和工具
		
转自:http://blog.csdn.net/opensure/article/details/46715769 JVM常用调试参数: –verbose:gc在虚拟机发生内存回收时在输出设备显示信息 ...
 - JDBC 查询的三大参数 setFetchSize prepareStatement(String sql,  int resultSetType, int resultSetConcur)
		
JDBC 查询的三大参数 本文转载至 http://blog.csdn.net/turkeyzhou/article/details/5115228 DBC1.0 .JDBC2.0 .JDBC3.0 ...
 - 深入理解JVM一配置参数
		
一.JVM配置参数分为三类参数: 1.跟踪参数 2.堆分配参数 3.栈分配参数 这三类参数分别用于跟踪监控JVM状态,分配堆内存以及分配栈内存. 二.跟踪参数 跟踪参数用于跟踪监控JVM,往往被开发人 ...
 - 一定要记住的14个JVM内存配置参数
		
jvm setting的参数确实比较多(Oracle官网Java HotSpot VM Options),但是作为一名java开发者,那几个最常用最基本的参数设置和意义一定要死记和理解.这里推荐一个网 ...
 - jvm的运行参数
		
1.我们为什么要对jvm做优化? 在本地开发环境中我们很少会遇到需要对jvm进行优化的需求,但是到了生产环境,我们可能将有下面的需求: 运行的应用“卡住了”,日志不输出,程序没有反应 服务器的CPU负 ...
 - [JVM教程与调优] 什么是JVM运行时参数?
		
我们接着上一章节[JVM教程与调优] JVM都有哪些参数类型?的内容继续讲解,这章我们来介绍一下:如何查看JVM运行时参数.这一点十分重要,因为我们在进行JVM参数调优的时候,我们首先得知道目前系统运 ...
 
随机推荐
- stat 命令家族(2)- 详解 pidstat
			
性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 对 Linux 任务的统计 ...
 - 019-链接 使用name属性
			
路由设置: (r'/', index.IndexHandler), tornado.web.url(r'/lj', index.LJHandler, {"word3":" ...
 - eric4 编译 中文 控件 报错 解决
			
eric4 在qt设计师界面, 设计 中文名控件 时,有时候不能编译,报错如下: 解决办法: 打开eric4---setting----preferences 按下图操作后 ,重新启动eric4即可解 ...
 - Linux三剑客老三---grep
			
1.Linux三剑客老三 过滤需要的内容,例子:grep -v oldboy hello.txt grep一般常用参数: -a:在二进制文件中,以文本文件的方式搜索数据. -c:计算找到"搜 ...
 - selenium定位方法(二)
			
selenium定位方法(二) 1.xpath定位:xpath是在XML中查找节点所在的路径的表达式 1)绝对路径的Xpath表达式 例:/html/body/div/div[1]/ul//li[3 ...
 - 四则运算生成命令行程序 (Python)
			
Github项目地址:Github Pages 结对项目成员:张鹏 3118004985 郑靓 3118004988 一.项目需求分析 二.功能实现 三.代码实现or功能说明 ★ GUI功能扩展说明 ...
 - SpringCloud Alibaba Nacos 服务治理中心
			
目录 一.什么是Nacos? 二.Nacos能干吗? 三.Nacos关键特性 四.Nacos中的基本概念 五.如何安装部署Nacos? 六.Nacos数据持久化 一.什么是Nacos? 英文全称Dyn ...
 - 什么是谷歌PageRank (简称PR值)
			
http://www.wocaoseo.com/thread-213-1-1.html 谷歌pageRank是谷歌用来评测网页质量高低的一个工具,主要分为0到10共11个等级,目前有很多的工具或谷歌工 ...
 - ssm框架之异常处理
			
异常处理思路 系统中异常包括两类:预期异常和运行时异常runtimeexception,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的dao.s ...
 - Qt 关于图片打开,另存为,保存到指定位置操作
			
Qt 关于图片打开,另存为,保存到指定位置操作(转载) 在头文件mainwindow.h中先声明以下类: 1 #include <QImage> 2 #include <QPixma ...