之前只知道设置-Xms,-Xmx这两个值的大小来限制JVM的内存申请额度,今天遇到了这个问题,搜索了一些资料,嗯,还是需要进一步了解的,所以这里记录一下。
1.内存划分
JVM将内存划分为以下三种:New(年轻代)、Tenured(年老代)、永久代(Perm)
其中,年轻代、年老代属于堆内存;永久代不属于堆内存,由虚拟机直接分配
年轻代:用于存放JVM刚分配的Java对象
年老代:经过垃圾回收,年轻代中没有回收掉的对象会被Copy到年老代
永久代:用于存放Class、Method元信息,大小与项目的规模、类、方法的量有关
2.年轻代划分
年轻代可以划分为以下三部分:Eden、Survivor1、Survivro2
其中,Eden用来存放JVM放分配的对象,两个Survivor的空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到年老代。
Survivor增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。
调整堆内存大小的参数:
-Xmx512m ------------------->最大总堆内存,推荐设置为物理内存的1/4
-Xms512m------------------->初始总堆内存,推荐将它设置的和最大堆内存一样大 (这样就不需要在GC之后,调整堆的大小了)
-Xmn192m ------------------->年轻带堆内存,官方推荐为整个堆的3/8
调整永久代(持久带)的参数:
-XX:PermSize=128m ------------------->堆的初始大小,一般设置为128m即可,原则为预留30%的空间
-XX:MaxPermSize=128m ------------------->堆的最大大小,一般设置为128m即可,原则为预留30%的空间
单位可以是m、g
1.查看目前JVM的配置
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
这里设置的是:JAVA_TOOL_OPTIONS:
Picked up JAVA_TOOL_OPTIONS: -Xms1g -Xmx30g
intx CompilerThreadStackSize = 0 {pd product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 1073741824 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 32212254720 {product}
intx ThreadStackSize = 1024 {pd product}
intx VMThreadStackSize = 1024 {pd product}
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
2.根据需要进行JVM的大小设置
根据需要测算自己所需要的-Xmx大小,检查一下物理内存是否充足,如果充足的话,可以继续进行相应的设置:
cat /proc/meminfo
MemTotal: 131740928 kB
MemFree: 104948660 kB
MemAvailable: 127801964 kB
Buffers: 0 kB
Cached: 23298608 kB
SwapCached: 97348 kB
Active: 7790576 kB
Inactive: 17784416 kB
Active(anon): 1723292 kB
Inactive(anon): 558948 kB
Active(file): 6067284 kB
Inactive(file): 17225468 kB
Unevictable: 0 kB
Mlocked: 0 kB
假定物理内存充足,检测java版本、系统版本是否支持想要设定的值:
# java -Xmx30g -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
如上,是可以的,那么,就可以开始修改.bashrc,来设定新的参数值了~
vi ~/.bashrc
export JAVA_TOOL_OPTIONS='-Xms30g -XMx30g'
source ~/.bashrc
3.进行核对检查
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
1.JVM调优总结(这个总结得比较全面)
2.JVM性能调优
3.Java系列笔记(4) - JVM监控与调优