如何开启jvm日志_做了10个小实验:搞懂了JVM三大参数类型

a48bf3fac3f4a1ffd99754158db77071.png

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

c8d491059920d1abdcb78b2f17da65a4.png

标配参数

常见标配参数

  • -version,获取JDK版本

  • -help,获取帮助

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

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

实验步骤:

  • 查看Java JDK 版本
java -version
baf2daf4417fb7d031ad2bdd62a44fbd.png
实验 1-1

可以看到Java JDK 版本为1.8.0_131

  • 查看 Java 帮助文档
java -help
a2fc656728b1d3837088a06d3902ad1d.png
实验 1-2
  • 查看版本和帮助文档
java -showversion
6ce7a6c16acb53c3c9a5cc5ba656e621.png
实验 1-3

X 参数

X 参数简介

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

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

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

  • 查看版本
java -version

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

baf2daf4417fb7d031ad2bdd62a44fbd.png
实验 2-1
  • 修改编译模式为解释执行模式
java -Xint -version

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

367d1e55e16bf139ad3540e643a9d35e.png
实验 2-2
  • 修改编译模式为只编译模式
java -Xcomp -version
707651346f7942af4cd574e3c116a4f0.png
实验 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 创建新文件

2a0c6bb820a2c0d1970599dc0e8fd9bf.png
New File

创建文件名为 demoXXparam.java

b094c26cdf9c2ca0bccf4fe38625510c.png
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 
cff77e33f524b9a1013200bf08a09308.png
编译代码

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

7166ff09eb8827e60ea7466bd318deda.png
生产Class文件

在 WebIDE 上运行 demoXXparam 代码

java demoXXparam
ea4b0282c3a2b6e2743c02939b25af34.png
运行Java程序

输出:

hello XX params

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

Terminal->New Terminal

3b18db32ddc4c8316b890894379d24af.png
开启新控制台窗口

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

jps -l
1c48f6f4826716f2e45f80bc3ad1a574.png
jps

发现demoXXparam进程的id为 518

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

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

jinfo -flag PrintGCDetails 518
1b01330b7daeba4610c7e30649cb4d59.png
jinfo

结果如下:

-XX:-PrintGCDetails

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

动手实验 4  - 开启参数

  • 在 WebIDE 控制台强制退出demoXXparam程序
ctrl + c
  • 然后清理屏幕
clear
  • 然后以参数 -XX:+PrintGCDetails 运行 demoXXparam 程序
java -XX:+PrintGCDetails demoXXparam
99b9260b209ba82ff1badc761dfe0e30.png
实验 4
  • 输出:
hello XX params

查看demoXXparam进程的 id

f4f940f06b96b0270e6aca56a0857a66.png
进程 id

可以看到demoXXparam进程 id 为 1225

查看 demoXXparam 的配置参数 PrintGCDetails

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

jinfo -flag PrintGCDetails 1225
e7eee597c62b4c78f726a04c0a6eb370.png
PrintGCDetails 参数

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

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

查看元空间的值

jinfo -flag MetaspaceSize 526
c38e44cf0d80ca7b3ef57f360430c65e.png
MetaspaceSize 大小

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

设置元空间的值为 128 M

java -XX:MetaspaceSize=128m demoXXparam   

查看元空间的大小

    jinfo -flag MetaspaceSize 1062
c1bc0165197db15511c61471f31db8a7.png
调整元空间大小

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

18e9fefc50dcd8952ead4c537135645e.png
设置 InitialHeapSize
java -XX:MaxHeapSize=200M demoXXparam
或者
java -Xmx200m demoXXparam

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

e2193e8dc757922fa32355a00180661d.png
设置 MaxHeapSize

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

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

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

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

java -XX:+PrintFlagsInitial -version 
08d8982dd4dd498dbd7c1343f02b9149.png
PrintFlagsInitial

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

java -XX:+PrintFlagsFinal -version 
976194aa599177716bf30bb0b25af10e.png
PrintFlagsFinal

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

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

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

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

    总结如下:

7ae02c31d928eed95257cdef240816de.png
出厂设置和自定义参数设置

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

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

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

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

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

java -XX:+PrintCommandLineFlags -version

会打印出如下参数:

1e2883207712c2a049c1d1a4a5a1159b.png
JVM 自动配置的XX选项

实验总结

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

JVM性能调优还有很多要讲的,一篇是讲不完的,后面有机会继续用实验的形式来分享。

往期资源  需要请自取

Java基础核心知识大总结.pdf 下载

68道C语言/C++常见面试题(含答案)下载

Java后端开发学习路线+知识点总结

前端开发学习路线+知识点总结

C/C++开发(后台)学习路线+知识点总结

嵌入式开发学习路线+知识点总结

每天进步一点点

慢一点才能更快

下篇见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA架构之SelectIO结构(一)

引言:从本文开始我们介绍Xilinx 7系列FPGA的SelectIO资源结构及使用,我们在进行FPGA外设硬件及软件设计时,如ADC、PHY、DDR3等,通常会涉及到该资源。本节我们介绍以下知识点:SelectIO资源概述及结构SelectIO管脚通用设…

IdentityServer4系列 | 混合模式

一、前言在上一篇关于授权码模式中, 已经介绍了关于授权码的基本内容,认识到这是一个拥有更为安全的机制,但这个仍然存在局限,虽然在文中我们说到通过后端的方式去获取token,这种由web服务器和授权服务器直接通信,不需要经过用户的…

3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...

大家都知道,现在不少的大佬比起用Word、Excel等等这些格式文件,它们更喜欢使用PDF文件。而我们不管是将Word、Excel等文件转换成PDF,还是将PDF转换成其他格式文件,都是一件麻烦事,更别说在手机上操作这一切了。别担心&…

如何使用 C# 中的 Tuple

开局一张图,首先声明的是 Tuple 不是什么新鲜概念,在编程语言 F#,Python 中早就有这个了,Tuple 是一种 有序的,有限不可变的,支持混杂类型的固定个数的 一种数据结构,有些朋友可能就想问了&…

中设置colorbar_【值得收藏】如何画出学术论文中需要的各种精美插图,看这一篇就够了!...

本文整理自知乎问答,仅用于学术分享,著作权归作者所有。如有侵权,请联系后台作删文处理。方法一作者|冯昱尧https://www.zhihu.com/question/21664179/answer/18928725强烈推荐 Python 的绘图模块 matplotlib: python plotting 。…

GraphQL:Descriptor Attributes

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进&#xff0c…

idea怎么把代码放到git_在IDEA中如何初始化Git,把项目推送到Git上

在IDEA中如何初始化Git,把项目推送到Git上登录Gitee(码云)账号,新建仓库先按如下步骤简单新建一个仓库:创建成功后,会出现下图中所示的原始文件:在IDEA上的Terminal中进行操作注意:可能有些朋友刚打开Termi…

大会线上同步直播, 来不到现场也可以线上看直播,以及参会秘籍

紧急提醒:还有1天!2020.NET开发者大会就要开幕啦!你都做好参会准备没有?特殊时期,为方便小伙伴们顺利参会,小编特意整理了这篇大会参会攻略,大到各种日程安排、小到签到、出行、防疫等&#xff…

大曾幽默打油诗_这才是真正的幽默打油诗,逗人一笑,又引人深思!

阅读本文前,请您先点击上面的蓝色字体“点点星光”,再点击“关注”,这样您就可以继续免费收到文章了。每天都有分享。完全是免费订阅,请放心关注来源:诗词天地大曾 ,曾初良,也乐斋主&#xff0c…

编程去除背景绿幕抠图,基于.NET+OpenCVSharp

摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时“抠人像、替换背景”的方式,对于项目中的算法进行了分析。本文中给出了简化OpenCVSharp中Mat、MatExpr等托管资源释放的方法。本文还介绍了“高效摄像头播放控件”以及和OpenCVSharp的性…

.NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

2.2.1 核心模块--依赖注入什么是依赖注入.NET Core DI 生命周期服务设计服务范围检查ASP.NET Core 依赖注入:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?viewaspnetcore-5.0什么是依赖注入Dependency injection 依赖注入Inv…

vue ref 绑定的事件需要移除吗_Vue易遗忘的基础复习(二)

数据请求Vue-resource请求在Vue2.0之后已经被舍弃2. fetch请求因为传统 Ajax (指 XMLHttpRequest)存在一些令人头疼的问题:配置和调用方式非常混乱,而且基于事件的异步模型写起来也没有现代的 Promise,generator/yield…

如何在 ASP.NET Core 中使用 API 分析器

ASP.NET Core 2.2 引入了 API 分析器,它有利于提高 API 的文档化,API分析器 可以应用在任何带有 ApiController 特性的 Controller 上,本篇就和大家一起讨论下。安装 API 分析器 如果你使用的是 ASP.NET Core 2.2 的话,用 Visual …

.net mysql字符串截取_【MySQL】字符串截取之SUBSTRING_INDEX和【MySQL】字符串四则运算...

substring_index(str,delim,count)str:要处理的字符串delim:分隔符count:计数例子:strwww.google.com1.count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容SELECT SUBSTRING_INDEX(www.google.com,.,1);结果是:wwwSELEC…

用C#+Selenium+ChromeDriver 爬取网页,完美模拟真实的用户浏览行为

背景Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。而对于爬虫来说,使用Selenium操控浏览器来爬取网上的数据那么肯定是爬虫中的杀手武器。这里,我将介绍selenium 谷歌浏览器的一般使…

ASP.NET Core ActionFilter引发的一个EF异常

最近在使用ASP.NET Core的时候出现了一个奇怪的问题。在一个Controller上使用了一个ActionFilter之后经常出现EF报错。InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guarante…

BCVP开发者说第5期:QuartzCore.Blazor

沉静岁月,淡忘流年1项目简介QuartzCore.BlazorQuartzCore.Blazor 是一个基于 .Net5 开发的轻量级 Quartz 作业配置中心,实践应用 Ant Design Blazor 和 FreeSql 两个技术, 对这两个技术感兴趣的小伙伴可以加我一起学习讨论哦,对有…

mysql update返回_MySQL中,当update修改数据与原数据相同时会再次执行吗?

本文同步Java知音社区,专注于Java作者:powdbahttps://yq.aliyun.com/articles/694162一、背景本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗?二、测试…

.NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记

2.2.2 核心模块--日志ILogger 的使用日志的 ID日志的分类日志的级别LoggerProvider日志的最佳实践.NET Core 和 ASP.NET Core 中的日志记录:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?viewaspnetcore-5.0ILogger 的使用在 Get 方法中添…

mysql数据库设计三大范式_了解数据库设计三大范式

数据库设计范式什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范…