输入“/”快速插入内容

JVM参数总结

1.
堆内存相关
Java虚拟机所管理的内存中最大的一块,Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的是存放对象实例,几乎所有对象实例以及数组都在这里分配内存
1.1
显示指定堆内存 -Xms 和-Xmx
与性能有关的最常见实践之一,根据应用程序要求初始化堆内存,若我们需要指定最小和最大堆大小(推荐显示指定大小)
代码块
-Xms<heap size>[unit]
-Xmx<heap size>[unit]
heap size:初始化内存的具体大小
unit:初始化内的单位,有g(GB)、m(MB)、k(KB)
举个例子:为JVM分配最小2GM、最大5GB的堆内存大小-Xms2G -Xmx5G
1.2
显示新生代内存(Young Gereration)
在堆总可用内存配置完成后,第二大影响因素是 Young Gereration在堆内存所占比例。默认情况下,YG的最小大小为1310MB,最大无限制
两种指定YG大小的方法
通过 -XX:NewSize、-XX:MaxNewSize指定
代码块
-XX:NewSize=<young size>[unit]
-XX:MaxNewSize=<young size>[unit]
举个例子,为新生代分配最小256m内存、最大1024m内存
-XX:NewSize=256m
-XX:MaxNewSize=1024m
-Xmn<young size>[unit]同时融合了上述两个参数
代码块
-Xmn<young size>[unit]
举个例子,为新生代分配最小、最大内存为256m
-Xmn256m
GC调优策略中的重要经验总结:
将新对象预留在新生代,由于Full GC的成本远高于Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目根据GC日志分析新时代空间大小分配是否合理,适当通过"-Xmn"命令调节新生代大小,最大限度降低新对象直接进入老年代的情况
可以通过 -XX:NewRatio=<int>来设置老年代与新生代内存的比值
老年代与新生代比值为1,也就是说老年代:新生代 = 1:1。-XX:NewRatio=1
1.3
显示指定永久代/元空间的大小
从Java8开始,若没有指定Metaspace的大小,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。
JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间,元空间使用的是本地内存
一些常用常数
代码块
-XX:MetaspaceSize=N #设置 Metaspace 的初始大小(是一个常见的误区,后面会解释)
-XX:MaxMetaspaceSize=N #设置 Metaspace 的最大大小
Metaspace 的初始容量并不是 -XX:MetaspaceSize 设置,无论 -XX:MetaspaceSize 配置什么值,对于 64 位 JVM 来说,Metaspace 的初始容量都是 21807104(约 20.8m)
Metaspace 由于使用不断扩容到-XX:MetaspaceSize参数指定的量,就会发生 FGC,且之后每次 Metaspace 扩容都会发生 Full GC
垃圾搜集器内部根据变量_capacity_until_GC来判断Metaspace区域是否达到阈值,初始化代码如下
代码块
void MetaspaceGC::initialize() {
// Set the high-water mark to MaxMetapaceSize during VM initialization since
// we can't do a GC during initialization.
_capacity_until_GC = MaxMetaspaceSize;
}