学习JVM参数前必须了解的
学习JVM参数前必须了解的
JVM参数是什么
大家照相通常使用手机就够用了,但是针对发烧友来说会使用更专业的设备,比如单反相机,在单反里有好几个模式,P/A/S/M,其中P是傻瓜模式,程序会自动根据环境设置快门速度和光圈大小,以得到相对合适的曝光效果。A档是光圈优先,用户可以自己设置光圈大小,快门速度等都交给相机程序来决定,类似半自动化的模式。S档是快门优先模式,和A档类似,只是用户可以设置快门速度。最后一个模式是M档,这是纯手动模式,由用户自己来调整快门速度,光圈大小等,这个对人的要求就会很高,但是很多专家往往都会选择M档来拍摄自己的作品。
可以把JVM想象成相机,JVM参数想象成光圈大小,快门速度之类的参数值,这些参数对程序的运行会影响挺大。
java程序跑在JVM上,JVM会根据环境自动设置一些JVM参数,但是这些参数并不能保证一定是最优的,有些参数在启动的时候就基本设置好了,它们在运行的时候还无法调整。为了让JVM能更好地运行你的程序,还是有必要对JVM参数有一定的理解,知道这些JVM参数分别在什么场景下有效果,起到什么作用,比如我们到底期不期望类可以卸载,是否可以在运行的时候打印一些日志协助我们了解JVM的运行情况,出问题的时候是否可以自动给我们做一些现场数据的保留等,这些都是可以通过JVM参数来设置的。
JVM参数有多少
相机调整的无非就那么几个参数值,那JVM参数到底有多少个呢,大概有1000多个,是不是让你很震惊,没错,确实有这么多。 大家可以到 JVM参数 | PerfMa应用性能技术社区 去看看所有这些JVM参数(注:这是PerfMa社区专门为大家分享JVM参数经验的讨论区),当然我们不一定非得对每个JVM参数要了解清楚,但是对一些常见的,有助于性能调优的JVM参数还是有必要了解一下的。
JVM参数通常设置的位置
我们启动一个java程序很简单,命令类似如下
java Main
我们都知道上面的Main是程序的启动类,JVM执行的时候会找到这个Main类里的如下签名的函数
Public static void main(String args[])
那这里函数的参数args怎么传进来的呢?我们通过在启动命令的主类后面加上相关的参数,参数之间用空格分开,JVM会自动将这些参数作为args的组成部分传进来,比如
java Main arg1 arg2
这样,args这个数组里自动会填充arg1和arg2两个元素,这样在你的程序里就可以使用这些参数了
我们把arg1和arg2这些叫做程序参数,但是和我们课程相关的并不是程序参数,而是JVM参数,那JVM参数放到哪里呢?JVM参数都是放在主类之前,java命令之后,比如
java -Xmx100M Main arg1 arg2
这里的-Xmx100M其实就是JVM参数,所以所有的JVM参数都是放在这个位置的,如果不是这个位置,那你设置的JVM参数将会是无效的,如果参数出现不符合预期的情况,那请第一时间检查的是你JVM参数设置的位置,当然还可能存在一些别的原因导致JVM参数和你设置的情况可能不一致的情况
JVM参数的写法
那JVM参数具体怎么写呢,可以有好几种
“-X” 开头的,比如-Xmx100M
“-XX: ” 开头的,比如-XX:+UseG1GC
“-” 开头的,比如-verbose:gc
其中-X和-开头的通常会被转换为一个或者多个-XX:开头的参数,只是一个简化的写法,比如说-Xmx100M,JVM里会自动转化为-XX:MaxHeapSize=100M,-verbose:class会自动转换为-XX:+TraceClassLoading -XX:+TraceClassUnloading
通过Flags参数指定JVM参数文件
如果JVM参数都和源码伴着一起发布的话,如果仅仅修改JVM参数也必须拉个分支提交代码,这不是很友好,有什么好办法呢?
我们可以在启动参数里设置一个参数就好,这个参数类似如下
java -XX:Flags=/home/admin/flags Main arg1 arg2
设置过这个参数之后,我们只要在服务的/home/admin目录下创建flags文件,同时在这个文件里指定所有的JVM参数就可以了,但是对flags文件里的参数写法会有些要求,-X之类的参数不能设置,但是可以用其等价的-XX的参数来替代,比如说-Xmx100M,只能用-XX:MaxHeapSize=100M来取代,同时在文件里不要出现-XX:,只要key=value或许+/-key就可以了,不同的参数之间用换行或者空格分开即可,比如flags文件的内容如下:
MaxHeapSize=8G +UseG1GC
其实等价于
-Xmx8G -XX:+UseG1GC
可以通过加上-XX:+PrintVMOptions可以打印设置过的JVM参数来验证,比如
java -XX:Flags=/home/admin/flags -XX:+PrintVMOptions Main arg1 arg2
通过VMOptionsFile参数来指定JVM参数文件
使用上面的Flags参数可能会比较别扭,因为设置参数和我们正常的写法不太一样,如果我们的JDK版本大于1.8的话,JVM提供了一个更人性化的参数,那就是VMOptionsFile来取代Flags,这也是指定一个文件,这个文件里的JVM参的写法和我们在java命令后写的JVM参数写法完全一样
java -XX:VMOptionsFile=/home/admin/flags Main arg1 arg2
在flags文件里我们可以这么写
-Xmx8G -XX:+UseG1GC
是不是方便了很多呢
开始JVM参数学习之旅
上面这些内容都了解清楚之后,就可以开始真正学习JVM参数了,我们也专门在社区给大家开了一门免费的学习JVM参数的课程,有兴趣的同学请到PerfMa社区进行了解学习,也欢迎大家参与讨论,慢慢揭开JVM参数的神秘面纱。
一起来学习吧: PerfMa KO 系列之 JVM 参数【Memory篇】
本文来自: PerfMa技术社区
PerfMa(笨马网络)官网
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
制造业的危机应对策略:短期内保生存,长远处谋发展
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 最近看了一个段子,是这么说的——是谁加速了企业的数字化转型?不是CEO,也不是CIO、CFO,而是Coronavirus(新冠病毒)。虽然只是一个玩笑,但确实是当下的真实写照。 一场新冠疫情,深刻诠释了何为人类命运共同体。截至目前,全球新冠病毒确诊病例已经超过了200万。这意味着,这场人类与病毒的PK战还将持续数月,而全球各国、各地区之间的长时间阻断隔离,必然对全球产业链、供应链带来巨大的冲击。这促使各行各业不得不去思考如何加速数字化,以更好地抵御这次全球化风险。 具体对制造企业来说,无论何时,最主要的目标都是提高收入、优化成本和降低风险,而其切入点也无非是研、产、供、销、服。只不过在面对当下这场危机时,更要“勒紧裤腰带”,在短期内先「保生存」,然后才能在未来继续「谋发展」。 短期生存,行甚于言 谈及企业在短期内的速赢生存方案,IBM全球企业咨询服务部大中华区认知决策服务行业总监陈松在接受至顶网记者采访时一言蔽之:“不要一直停留在担忧和思考的状态,赶快行动起来才是最好的‘生存’方案。” ...
- 下一篇
在Maven项目中运行JUnit 5测试用例
本文演示了如何如何编写JUnit 5测试用例,在Maven项目中运行JUnit 5测试用例。 编写JUnit 5测试用例 如果你是Java开发者,那么对于JUnit应该就不陌生。JUnit是Java单元测试的基础工具。 JUnit目前最新的版本是JUnit 5.x,但广大的Java开发者估计还停留在JUnit 4.x,因此有必要演示下如何编写JUnit 5测试用例。 引入JUnit 5依赖 相比较JUnit 4而言,JUnit 5一个比较大的改变是JUnit 5拥有与JUnit 4不同的全新的API。JUnit 5分成了三部分: JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage JUnit Platform是在JVM上启动测试框架的基础。 它还定义了TestEngine API,用于开发在平台上运行的测试框架。 此外,该JUnit Platform还提供了一个控制台启动器(用于从命令行启动该平台)和一个基于JUnit 4的运行器,用于在基于JUnit 4的环境中在该平台上运行任何TestEngine。 流行的IDE(Int...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,8上快速安装Gitea,搭建Git服务器