美文网首页JVM
JVM参数类型及配置实战

JVM参数类型及配置实战

作者: Jay_星晨 | 来源:发表于2020-08-12 14:21 被阅读0次

    一、JVM参数类型

    JVM参数类型分为3种:标配参数X参数XX参数

    二、标配参数

    java:
    -version-help-client-server-classpath-cp-showversion
    此类参数无论jdk怎么升级,参数仍然保持不变,相对比较稳定的参数。

    三、X参数

    非标准化参数,变化较小
    -Xin: 解释执行。
    -Xcomp: 第一次使用就编译成本地代码。
    -Xmixed: 混合模式,JVM自己来决定是否编译成本地代码,默认使用的就是混合模式。

    [root@yun-develop-service_01 ycopen]# java -version
    java version "1.8.0_172"
    Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
    
    [root@yun-develop-service_01 ycopen]# java -Xint -version
    java version "1.8.0_172"
    Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, interpreted mode)
    
    [root@yun-develop-service_01 ycopen]# java -Xcomp -version
    java version "1.8.0_172"
    Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, compiled mode)
    

    四、XX参数

    非标准化参数,相对不稳定,主要用于JVM调优和debug。它分为Boolean型和K-V型两种类型。

    1)Boolean类型

    1、格式

    -XX:[+-]<name>, 其中+-表示启用或禁用name属性。

    2、示例

    -XX:+UseConcMarkSweepGC 表示启用CMS垃圾收集器。
    -XX:+UseG1GC 表示启用G1垃圾收集器。

    2)K-V类型

    1、格式

    -XX:<name>=<value> 表示name属性对应的值是value。

    2、示例

    -XX:MaxGCPauseMillis=500 表示GC的最大停顿时间是500毫秒。

    注意:-Xmx和-Xms表示设置JVM的最大内存和最小内存,它们不是X参数,而是XX参数。
    -Xmx等价于-XX:MaxHeapSize
    -Xms等价于-XX:InitialHeapSize
    -Xss等价于-XX:ThreadStackSize

    [root@yun-develop-service_01 ycopen]# jinfo -flag MaxHeapSize 10211
    -XX:MaxHeapSize=3221225472
    

    五、常用JVM参数

    -Xms: 初始堆大小,是指设定程序启动时占用内存大小,默认为服务器内存的1/64。大点程序会启动的快一点,但是也可能会导致机器暂时间变慢。
    -Xmx: 最大堆大小,是指设定程序运行期间最大可占用的内存大小,默认为服务器内存的1/4。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。
    -Xss: 为jvm启动的每个线程分配的内存大小,是指设定每个线程的堆栈大小,默认为512K-1024K,大小取决于服务器配置,从java8以后,默认都是1024K。这个要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。
    -Xmn: 年轻代大小
    -MetaspaceSize: 元空间大小
    整个堆大小=年轻代大小 + 年老代大小 + 持久代(JDK1.8以后称为元空间)大小

    六、JVM内存配置规范

    1. 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。 因此服务器一般设置-Xms和-Xmx相等以避免在每次GC后调整堆的大小。
    2. 可以利用JVM提供的-Xmn,-Xms,-Xmx等选项进行堆内存设置; 一般将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值,建议堆的最大值可以设置为可用内存的最大值的80%。
    3. 16G内存的服务器配置为:-Xmx=16G*0.8=12G,-Xms默认和-Xmx大小一样,也为12G。-Xmn为1/4的-Xmx值,为4G。

    七、配置示例

    1. 服务器硬件配置
      8核CPU、8G 内存,JDK 1.8.X
    2. 参数配置实例
    -server -Xmx3550m -Xms3550m -Xmn1256m -Xss128k -XX:SurvivorRatio=6 -XX:MaxPermSize=256m -XX:ParallelGCThreads=8 -XX:MaxTenuringThreshold=0 -XX:+UseConcMarkSweepGC
    
    1. 调优说明
    • -Xmx 与 -Xms 相同以避免JVM反复重新申请内存。-Xmx 的大小约等于系统内存大小的一半,即充分利用系统资源,又给予系统安全运行的空间。
    • -Xmn1256m 设置年轻代大小为1256MB。此值对系统性能影响较大,Sun官方推荐配置年轻代大小为整个堆的3/8。
    • -Xss128k 设置较小的线程栈以支持创建更多的线程,支持海量访问,并提升系统性能。
    • -XX:SurvivorRatio=6 设置年轻代中Eden区与Survivor区的比值。系统默认是8,根据经验设置为6,则2个Survivor区与1个Eden区的比值为2:6,一个Survivor区占整个年轻代的1/8。
    • -XX:ParallelGCThreads=8 配置并行收集器的线程数,即同时8个线程一起进行垃圾回收。此值一般配置为与CPU数目相等。
    • -XX:MaxTenuringThreshold=0 设置垃圾最大年龄(在年轻代的存活次数)。如果设置为0的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用,可以提高效率;如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。根据被海量访问的动态Web应用之特点,其内存要么被缓存起来以减少直接访问DB,要么被快速回收以支持高并发海量请求,因此其内存对象在年轻代存活多次意义不大,可以直接进入年老代,根据实际应用效果,在这里设置此值为0。
    • -XX:+UseConcMarkSweepGC 设置年老代为并发收集。CMS(ConcMarkSweepGC)收集的目标是尽量减少应用的暂停时间,减少Full GC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代内存,适用于应用中存在比较多的长生命周期对象的情况。

    相关文章

      网友评论

        本文标题:JVM参数类型及配置实战

        本文链接:https://www.haomeiwen.com/subject/ifopdktx.html