JVM
是最好的软件工程之一,它为
Java
提供了坚实的基础,许多流行语言如
Kotlin
、
Scala
、
Clojure
、
Groovy
都使用
JVM
作为运行基础。一个专业的
Java
工程师必须要了解并掌握
JVM
,接下来小编就给大家分享
Java
基础知识中
JVM
调优相关知识点。
JVM
常见的调优参数包括:
-Xmx
:
指定
java程序的最大堆内存
,
使用
java -Xmx5000M -version
判断当前系统能分配的最大堆内存;
-Xms
:
指定最小堆内存
, 通常设置成跟最大堆内存一样,减少
GC
;
-Xmn
:
设置年轻代大小。整个堆大小
=年轻代大小
+
年老代大小。所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,
Sun
官方推荐配置为整个堆的
3/8
;
-Xss
:
指定线程的最大栈空间
, 此参数决定了
java
函数调用的深度
,
值越大调用深度越深
,
若值太小则容易出栈溢出错误
(StackOverflowError)
;
-XX:PermSize
:
指定方法区
(永久区
)
的初始值
,
默认是物理内存的
1/64
,在
Java8
永久区移除
,
代之的是元数据区,由
-XX:MetaspaceSize
指定;
-XX:MaxPermSize
:
指定方法区的最大值
, 默认是物理内存的
1/4
,在
java8
中由
-XX:MaxMetaspaceSize
指定元数据区的大小;
-XX:NewRatio=n
:
年老代与年轻代的比值,
-XX:NewRatio=2, 表示年老代与年轻代的比值为
2:1
;
-XX:SurvivorRatio=n
:
Eden区与
Survivor
区的大小比值,
-XX:SurvivorRatio=8
表示
Eden
区与
Survivor
区的大小比值是
8:1:1
,因为
Survivor
区有两个
(from, to)
。
JVM
实质上分为三大块,年轻代
(YoungGen)
,年老代
(Old Memory)
,及持久代
(Perm
,在
Java8
中被取消
)
。
年轻代大小选择
响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
吞吐量优先的应用:尽可能的设置大,可能到达
Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合
8CPU
以上的应用。