5 分钟掌握 JVM 常用选项及相关知识,工作面试够用了,dubbo 和 zkeper 的面试题
本文截取 java 后端服务最常用的 jvm 选项,逐一解释它们的作用及 JVM 内存、GC、类加载等相关知识,建议收藏。为避免篇幅太长,本次介绍最小堆大小(-Xmsize)、最大堆大小(-Xmxsize),以及新生代大小(-Xmnsize)的设置。
相信很多 java 工程师在工作中都会接触到 jvm,在面试中也会被问到跟 java 虚拟机有关的问题。我们为了把工作做好、把项目维护好、在系统出现 fullgc 等问题的时候,能够像老司机一样准确定位问题,很有必要把 java 虚拟机知识学习一遍。
然而,Java 虚拟机的知识量很大,买一本书回来慢慢学习会比较消耗时间(例如《深入理解 Java 虚拟机》,其实这本书也只算"凑合")。况且 jvm 优质学习资源较少,只有官方文档较好,但是官方文档内容又太多了,不适合作为学习教材,而且还是英文的。
即使你下定决心,准备把 Java 虚拟机的所有知识彻底学一遍,也很有可能遇到这些问题:1)看到后面忘记前面;2)看的时候,没有练习机会,导致在实际要用的时候,又不知道怎么办;3)看完之后,当时虽然记得,但是过了一段时间之后,又都忘掉了。
针对上面这些问题,我们应该从实践出发,带着目的学习。这样不但记得牢、而且一开始就面向实践,理解得也要比单纯的看资料深入。在这篇文章中,就以我们公司的某个后端服务的 java 启动选项为例,介绍这些 jvm 选项,逐个解释这些选项的作用,及相关的 JVM 内存管理、GC 或类加载等知识。
我们公司某一个大流量的后端服务配置了这些 jvm 选项(这些选项也是目前国内互联网公司经常用到的),如下图所示。
1) -Xms4G 解释
这个配置项对应的 JVM 选项是?-Xms<size>,其中,4G 是参数值。
我们知道 java 命令是用来启动 java 虚拟机执行 java 代码的。java 命令支持很多选项,在这些选项当中,以"-X"开头的,都是 Java 虚拟机选项;不以"-X"开头的选项,不是传给 Java 虚拟机的,例如"java -jar filename.jar"中的"-jar"不是传给 JVM 的。
所以,-Xms4G 中的-X 代表这是一个 jvm 选项,m 代表 memory,对于 jvm 而言 memory 就是堆;s 是 smallest,最小的意思。-Xms4G 代表把 JVM 的堆的最小值设为 4G。
jvm 堆随着 java 程序的运行不断增大,因此,这里的堆最小值也是 jvm 初始堆大小。当 jvm 运行一段时间后,堆大小超过初始值,这里配置的值其实没什么用了。
所以,最小堆大小或初始堆大小只影响 JVM 启动阶段,对后续 jvm 运行没什么影响。
那么,在实际运用中,-Xms<size>应该配置成多少呢?假如服务器是 8 核 16G,先设置成 10G,即物理内存的一半再多加一些(建议跟最大堆大小设置成相同值,这样可以减少刚部署阶段的 fullgc 次数),然后运行一段时间再看容器的监控,看容器还剩多少内存。如果还剩很多,再调大一些,例如设置成 12G,直到充分利用容器物理内存为止。
2) -Xmx4G 解释
对应的 JVM 选项是?-Xmx<size>,它跟前面-Xms<size>类似,配置方法完全一样。
![5 分钟掌握 JVM 常用选项及相关知
识,工作面试够用了](https://static001.geekbang.org/infoq/a1/a11b1fdf5f766ca3d7c5803682c83d2f.png)
-Xmx4G 中,m 代表 memory,x 是 maximum,最大的意思。-Xmx4G 就是把 JVM 的堆的最大值设为 4G。
前面说过,随着 java 程序运行,堆会从初始值开始稳步增长,当达到最大值以后就不再增长,以后主要靠 GC 来回收内存。所以,堆最大值的设置要比最小值谨慎,配置小了,程序内存不够用,频繁 GC;配置得太大,每次 GC 时间比较长,程序有停顿现象(也跟垃圾回收器的选择有关)。对后端服务而言,堆最大值一般与堆最小值配置成一样的即可。
实际工作中,-Xmx<size>的值怎么选?按照前面-Xms<size>的配置方法操作即可。如果每次 GC 时间较长,说明堆配置值的大了,适当减小堆最大值。
评论