秒懂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的三大参数类型,就靠这十个小实验了的更多相关文章

  1. [JVM教程与调优] JVM都有哪些参数类型?

    JDK本身是提供了一些监控工具,有一些是命令行,也有图形界面.本次介绍命令行如何进行监控. 命令行是非常重要的,因为在我们生产环境基本上是没有图形界面的,完全是通过命令行. 主要内容: JVM的参数类 ...

  2. JVM探秘:JVM的参数类型

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. JVM的参数类型,大致可以分为标准参数.X参数.XX参数,而XX参数又可以分为Bool ...

  3. MySql学习 (一) —— 基本数据库操作语句、三大列类型

    注:该MySql系列博客仅为个人学习笔记. 在使用MySql的时候,基本都是用图形化工具,如navicat.最近发现连最基本的创建表的语法都快忘了... 所以,想要重新系统性的学习下MySql,为后面 ...

  4. JVM调优系列:(五)JVM常用调试参数和工具

    转自:http://blog.csdn.net/opensure/article/details/46715769 JVM常用调试参数: –verbose:gc在虚拟机发生内存回收时在输出设备显示信息 ...

  5. JDBC 查询的三大参数 setFetchSize prepareStatement(String sql, int resultSetType, int resultSetConcur)

    JDBC 查询的三大参数 本文转载至 http://blog.csdn.net/turkeyzhou/article/details/5115228 DBC1.0 .JDBC2.0 .JDBC3.0  ...

  6. 深入理解JVM一配置参数

    一.JVM配置参数分为三类参数: 1.跟踪参数 2.堆分配参数 3.栈分配参数 这三类参数分别用于跟踪监控JVM状态,分配堆内存以及分配栈内存. 二.跟踪参数 跟踪参数用于跟踪监控JVM,往往被开发人 ...

  7. 一定要记住的14个JVM内存配置参数

    jvm setting的参数确实比较多(Oracle官网Java HotSpot VM Options),但是作为一名java开发者,那几个最常用最基本的参数设置和意义一定要死记和理解.这里推荐一个网 ...

  8. jvm的运行参数

    1.我们为什么要对jvm做优化? 在本地开发环境中我们很少会遇到需要对jvm进行优化的需求,但是到了生产环境,我们可能将有下面的需求: 运行的应用“卡住了”,日志不输出,程序没有反应 服务器的CPU负 ...

  9. [JVM教程与调优] 什么是JVM运行时参数?

    我们接着上一章节[JVM教程与调优] JVM都有哪些参数类型?的内容继续讲解,这章我们来介绍一下:如何查看JVM运行时参数.这一点十分重要,因为我们在进行JVM参数调优的时候,我们首先得知道目前系统运 ...

随机推荐

  1. GaussDB连接与登出

    连接 连接命令1: gsql -d ${dbName} -U ${userName} -p {port:默认为25308} -h {ip} -W {password} 连接命令2: gsql -d p ...

  2. IOS 如何持久化自定义对象 2014-08-01 01:38

    如果持久话自定义对象 那么这个对象一定要遵循 NSCoding 协议 并实现编解码:然后再将编解码后的数据 NSKeyedArchiver 到NSData中   @interface NSKeyAnd ...

  3. NOSQL基础

    一.mongoDB介绍和使用 1.分布式文件储存数据库,使用C++开发的,可以存储任意数据(文件),允许在服务器端执行脚本,使用JSON形式储存数据{key:value} 2.支持的编程语言有:PHP ...

  4. JavaSwing关于GridBagLayout(网格袋布局)的使用

    下面的链接有初步的介绍: https://blog.csdn.net/xietansheng/article/details/72814552 关于GridBagConstraints: GridBa ...

  5. hook框架-frida使用-APP在模拟器无法打开,用钩子去除限制

    app拿soul为例子 一.环境配置 #模拟器的frida服务为86 #frida-server-12.9.8-android-x86 adb push frida-server-12.9.8-and ...

  6. AWS 学习笔记之 VPC

    原文:https://ericfu.me/aws-notes-vpc/ VPC 把 VPC 想象成一个逻辑上的数据中心 包含一个 IGW (Internet Gateway)或者 Virtual Pr ...

  7. foreach循環體控制

    通常情況下,在程式中的cursor定義之前,整合了l_sql變量后,轉化sql語句時,通過檢查STATUS的值來判斷sql語句是否有錯誤. 語句如:              if STATUS th ...

  8. SpringCloud微服务项目实战 - API网关Gateway详解实现

    前面讲过zuul的网关实现,那为什么今天又要讲Spring Cloud Gateway呢?原因很简单.就是Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用 ...

  9. LR与LR?

    目录 逻辑回归与线性回归 逻辑回归 1.建立目标函数 2. 梯度求解 3. 实现 线性回归 1. 建立目标函数 2. 求解 3. 实现 逻辑回归与交叉熵 逻辑回归与线性回归 逻辑回归 线性回归 目标函 ...

  10. mysql建数据库的字符集与排序规则说明

    本文转自https://blog.csdn.net/qq_38224812/article/details/80745868,感谢作者,自己留存已备他日使用 1.字符集说明: 一般选择utf8.下面介 ...