学习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篇】
学习JVM参数前必须了解的的更多相关文章
- 【学习】011 JVM参数调优配置
自动内存管理机制 Java虚拟机原理 所谓虚拟机,就是一台虚拟的机器.他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为 系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box.Vmar ...
- JVM参数(二)参数分类和即时(JIT)编译器诊断
在这个系列的第二部分,我来介绍一下HotSpot JVM提供的不同类别的参数.我同样会讨论一些关于JIT编译器诊断的有趣参数. JVM 参数分类 HotSpot JVM 提供了三类参数.第一类包括了标 ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- 学习JVM是如何从入门到放弃的?
前言 只有光头才能变强 JVM在准备面试的时候就有看了,一直没时间写笔记.现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书. 学习JVM的目的也很简单: 能够知道JVM是什么,为我们干 ...
- JVM基础系列第14讲:JVM参数之GC日志配置
说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...
- 学习JVM
所谓虚拟机,就是一台虚拟的机器.它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机,大名鼎鼎的Visual Box.VMware就属于系统虚拟机,他们完全是对物理计 ...
- 学习JVM虚拟机原理总结
0x00:JAVA虚拟机的前世今生 1991年,在Sun公司工作期间,詹姆斯·高斯林和一群技术人员创建了一个名为Oak的项目,旨在开发运行于虚拟机的编程语言,允许程序多平台上运行.后来,这项工作就演变 ...
- 学习jvm(一)--java内存区域
前言 通过学习深入理解java虚拟机的教程,以及自己在网上的查询的资料,做一个对jvm学习过程中的小总结. 本文章内容首先讲解java的内存分布区域,之后讲内存的分配原则以及内存的监控工具.再下来会着 ...
- Java 6 JVM参数选项大全(中文版)
原文来自: http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm 本文是基于最新的SUN官方文档Java SE 6 Hotsp ...
随机推荐
- Selenium系列(九) - 针对alert窗口的处理(警告框、确认框、对话框)
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- [JVM教程与调优] JVM都有哪些参数类型?
JDK本身是提供了一些监控工具,有一些是命令行,也有图形界面.本次介绍命令行如何进行监控. 命令行是非常重要的,因为在我们生产环境基本上是没有图形界面的,完全是通过命令行. 主要内容: JVM的参数类 ...
- Android之MVC、MVP、MVVM
本文将详细阐述以下MVC.MVP.MVVM三种理念的定义 MVC MVC全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个 基本部分:模型(Model ...
- FastAI 简介
Fastai简介 在深度学习领域,最受学生欢迎的MOOC课程平台有三个:Fast.ai.deeplearning.ai /Coursera和Udacity.Fastai作为其中之一,是一个课程平台,一 ...
- Spring ioc xml 实例化bean 自己实现
public class DefClassPathXmlApplicationContext { private String xmlPath; public DefClassPathXmlAppli ...
- Spinner的简单实用
1.Spinner的功能 Spinner在Android中主要实现的是一个下拉列表,这个下拉列表相当于弹出一个弹出一个菜单供用户选择.即Spinner提供一个快速的方法从一组中选择一个值,默认状态下S ...
- 【Redis】集群教程(Windows)
概述 Redis集群数据分片 Redis集群节点通讯 环境准备 搭建Redis集群 测试Redis集群 概述 Redis Cluster provides a way to run a Redis i ...
- PTA数据结构与算法题目集(中文) 7-23
PTA数据结构与算法题目集(中文) 7-23 7-23 还原二叉树 (25 分) 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. 输入格式: 输入首先给出正整数N(≤50) ...
- PTA | 1014 福尔摩斯的约会 (20分)
大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...
- 操作系统-2-存储管理之LRU页面置换算法(LeetCode146)
LRU缓存机制 题目:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制. 它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...