JDK8的内存调优主要针对的是堆和元空间。内存调优时常用到JVM参数有这些:
-server
JVM的server模式, 在多CPU服务器中性能可以得到更好地发挥。JDK的64位版本只支持server模式,因此在这种情况下,选项是隐式的,即默认是server模式。
内存调优实例
尽可能把堆内存的空间设置大一些,以减少垃圾回收的次数。假设服务器上的可用内存还有12GB,那么先指定堆所分配内存的最大值和初始值为8GB。一般情况下,年轻代内存大小需在整个堆大小的1/2到1/4之间,那么就指定年轻代内存大小为3GB。再把Eden区和一个Survivor区的空间大小的比率设置为4。元空间第一次触发垃圾回收的内存大小的阈值设置为256MB,一般情况下足够用。元空间所分配内存的最大值设置为512MB,为了避免极端情况下占用大量内存。另外,还需要明确指定JVM以server模式启动。
java -server -Xmx8G -Xms8G -Xmn3G -XX:SurvivorRatio=4 -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=512M -jar one-more-study-0.0.1-SNAPSHOT.jar
如果执行jmap -heap命令查看对应Java进程的内存配置和使用情况,应该是这样的:
Attaching to process ID 31828, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.251-b08
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration: #堆的内存配置
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
# 堆内存的最大值
MaxHeapSize = 8589934592 (8192.0MB)
# 年轻代内存的大小
NewSize = 3221225472 (3072.0MB)
# 年轻代内存的最大值
MaxNewSize = 3221225472 (3072.0MB)
# 老年代内存的大小
OldSize = 5368709120 (5120.0MB)
# 老年代和年轻代空间大小的比率
# 因为设置Xmn参数,该设置未生效
NewRatio = 2
#Eden区和一个Survivor区的空间大小的比率
SurvivorRatio = 4
# 元空间第一次触发垃圾回收的内存大小
MetaspaceSize = 268435456 (256.0MB)
# 元空间内存的最大值
MaxMetaspaceSize = 536870912 (512.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: # 堆的使用情况
PS Young Generation
Eden Space: # Eden区内存的使用情况
capacity = 2147483648 (2048.0MB)
used = 901945720 (860.16MB)
free = 1245537928 (1187.83MB)
42.000120505690575% used
From Space: # Survivor的From区内存的使用情况
capacity = 536870912 (512.0MB)
used = 0 (0.0MB)
free = 536870912 (512.0MB)
0.0% used
To Space: # Survivor的To区内存的使用情况
capacity = 536870912 (512.0MB)
used = 0 (0.0MB)
free = 536870912 (512.0MB)
0.0% used
PS Old Generation # 老年代内存的使用情况
capacity = 5368709120 (5120.0MB)
used = 0 (0.0MB)
free = 5368709120 (5120.0MB)
0.0% used
12047 interned Strings occupying 1045744 bytes.