JVM--内存限制设定

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/orange_612/article/details/81904225

前言:

之前只知道设置-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监控与调优

猜你喜欢

转载自blog.csdn.net/orange_612/article/details/81904225