精华内容
下载资源
问答
  • jvm参数调优

    2019-09-24 07:33:50
    jvm参数调优 JVM 参数调优: 堆空间主要组成部分: 1:新生代(new generation),新生代又划分为3部分: 1eden 2From Survivor(s0区域) 3To Survivor(s1区...

     

    JVM 参数调优:

       

    堆空间主要组成部分:

       

    1:新生代(new generation),新生代又划分为3部分:

    1 eden

    2 From Survivor(s0区域)

    3 To Survivor(s1区域)

    其中s0和s1区域大小相等

    2:老年代(tenured generation)

       

    new出来的对象都会存放在堆内存中

       

    新生代和老年代的存在主要用于垃圾回收机制,其中主要针对的是新生代,因为对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经过一次新生代回收,如果对象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代。

       

    JVM调优方案:

    相关优化参数

    -Xms 

    堆初始值

      

    -Xmx 

    堆最大可用值

      

    -Xmn

    新生代最大可用值

    一般为堆大小的1/3或者1/4

    -XX:SurvivorRatio

    设置新生代中eden空间和from/to空间的比例

    -XX:SurvivorRatio=eden/from=eden/to

    -XX:NewRatio

    设置老年代和新生代比例

    -XX:NewRatio=老年代/新生代

       

       

    思路:

       

    在JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到一些目标:

    1、GC的时间足够的小

    2、GC的次数足够的少

    3、发生Full GC(新生代和老年代)的周期足够的长

    前两个目前是相悖的,要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一个更大的堆,我们只能取其平衡。

    (1)针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值

    (2)年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过调节二者的比例为1:3或者1:4,当然也可以设置新生代的大小,原则上为堆空间的1/3或者1/4

       

    // 设置老年代和新生代比例为3:1

    -Xms20m -Xmx20m -XX:SurvivorRatio=8 -XX:NewRatio=3 -XX:+PrintGCDetails -XX:+UseSerialGC

    package com.linxi.jia;

       

    /**

    * Created by 156 on 2019/2/13.

    */

    public class JvmDemo02 {

       

    // 设置新生代和老年代优化参数

    public static void main(String[] args) {

    //-Xms20m -Xmx20m -XX:SurvivorRatio=8 -XX:NewRatio=3 -XX:+PrintGCDetails -XX:+UseSerialGC

    byte [] b = null;

    for (int i = 0; i < 2; i++) {

    b =new byte[1*1024*1024];

    }

       

    }

    }

       

    // 设置新生代大小为堆的1/4

    -Xms20m -Xmx20m -Xmn5m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC

       

    上面两种方式任选一种即可。

       

    (3)年轻代和年老代设置多大才算合理?这个我问题毫无疑问是没有答案的,否则也就不会有调优。我们观察一下二者大

    小变化有哪些影响更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增加每次GC的时间;小的年老代会导致更频繁的Full GC更小的年轻代必然导致更大年老代,小的年轻代会导致普通GC很频繁,但每次的GC时间会更短;大的年老代会减少Full GC的频率如何选择应该依赖应用程序对象生命周期的分布情况:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性,在抉择时应该根据以下点:(A)本着Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理(B)通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻 代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间

       

       

    堆内存溢出

       

    栈内存溢出

       

    错误原因: java.lang.StackOverflowError 栈内存溢出

    栈溢出 产生于递归调用,循环遍历是不会的,但是循环方法里面产生递归调用, 也会发生栈溢出。

    解决办法:设置线程最大调用深度

    -Xss5m 设置最大调用深度

       

    Tomcat内存溢出在catalina.sh 修改JVM堆内存大小

    JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"

    posted on 2019-08-07 17:04 shoshana~ 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/shoshana-kong/p/11316421.html

    展开全文
  • JVM参数调优

    2020-10-29 19:49:59
    JVM参数调优 前言 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值 使用jps和jinfo进行查看 -Xms:初始堆空间 -Xmx:堆最大值 -Xss:栈空间 -Xms 和 -Xmx最好调整一致,防止JVM频繁进行收集和回收 JVM...

    前言

    你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值

    使用jps和jinfo进行查看

    -Xms:初始堆空间
    -Xmx:堆最大值
    -Xss:栈空间
    

    -Xms 和 -Xmx最好调整一致,防止JVM频繁进行收集和回收

    JVM参数类型

    • 标配参数(从JDK1.0 - Java12都在,很稳定)
      • -version
      • -help
      • java -showversion
    • X参数(了解)
      • -Xint:解释执行
      • -Xcomp:第一次使用就编译成本地代码
      • -Xmixed:混合模式
    • XX参数(重点)
      • Boolean类型
        • 公式:-XX:+ 或者-某个属性 + 表示开启,-表示关闭
        • Case:-XX:-PrintGCDetails:表示关闭了GC详情输出
      • key-value类型
        • 公式:-XX:属性key=属性value
        • 不满意初始值,可以通过下列命令调整
        • case:如何:-XX:MetaspaceSize=21807104:查看Java元空间的值

    查看运行的Java程序,JVM参数是否开启,具体值为多少?

    首先我们运行一个HelloGC的java程序

    
    public class HelloGC {
    
        public static void main(String[] args) throws InterruptedException {
            System.out.println("hello GC");
            Thread.sleep(Integer.MAX_VALUE);
        }
    }
    

    然后使用下列命令查看它的默认参数

    jps:查看java的后台进程
    jinfo:查看正在运行的java程序
    

    具体使用:

    jps -l      //得到进程号
    
    12608 com.moxi.interview.study.GC.HelloGC
    15200 sun.tools.jps.Jps
    15296 org.jetbrains.idea.maven.server.RemoteMavenServer36
    4528
    12216 org.jetbrains.jps.cmdline.Launcher
    9772 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
    

    查看到HelloGC的进程号为:12608

    我们使用jinfo -flag 然后查看是否开启PrintGCDetails这个参数

    jinfo -flag PrintGCDetails 12608
    

    得到的内容为

    -XX:-PrintGCDetails
    

    上面提到了,-号表示关闭,即没有开启PrintGCDetails这个参数

    下面我们需要在启动HelloGC的时候,增加 PrintGCDetails这个参数,需要在运行程序的时候配置JVM参数

    然后在VM Options中加入下面的代码,现在+号表示开启

    -XX:+PrintGCDetails
    

    然后在使用jinfo查看我们的配置

    jps -l
    jinfo -flag PrintGCDetails 13540
    

    得到的结果为

    -XX:+PrintGCDetails
    

    在这里插入图片描述

    我们看到原来的-号变成了+号,说明我们通过 VM Options配置的JVM参数已经生效了

    使用下列命令,会把jvm的全部默认参数输出

    jinfo -flags ***
    

    题外话(坑题)

    两个经典参数:-Xms 和 -Xmx,这两个参数 如何解释

    这两个参数,还是属于XX参数,因为取了别名

    • -Xms 等价于 -XX:InitialHeapSize :初始化堆内存(默认只会用最大物理内存的64分1)
    • -Xmx 等价于 -XX:MaxHeapSize :最大堆内存(默认只会用最大物理内存的4分1)

    查看JVM默认参数

    • -XX:+PrintFlagsInitial

      • 主要是查看初始默认值
      • 公式
        • java -XX:+PrintFlagsInitial -version
        • java -XX:+PrintFlagsInitial(重要参数)
          在这里插入图片描述
    • -XX:+PrintFlagsFinal:表示修改以后,最终的值

    ​ 会将JVM的各个结果都进行打印

    ​ 如果有 := 表示修改过的, = 表示没有修改过的

    工作中常用的JVM基本配置参数

    在这里插入图片描述

    查看堆内存

    查看JVM的初始化堆内存 -Xms 和最大堆内存 Xmx

    
    public class HelloGC {
    
        public static void main(String[] args) throws InterruptedException {
            // 返回Java虚拟机中内存的总量
            long totalMemory = Runtime.getRuntime().totalMemory();
    
            // 返回Java虚拟机中试图使用的最大内存量
            long maxMemory = Runtime.getRuntime().maxMemory();
    
            System.out.println("TOTAL_MEMORY(-Xms) = " + totalMemory + "(字节)、" + (totalMemory / (double)1024 / 1024) + "MB");
            System.out.println("MAX_MEMORY(-Xmx) = " + maxMemory + "(字节)、" + (maxMemory / (double)1024 / 1024) + "MB");
    
        }
    }
    

    运行结果为:

    TOTAL_MEMORY(-Xms) = 257425408(字节)、245.5MB
    MAX_MEMORY(-Xmx) = 3790077952(字节)、3614.5MB
    

    -Xms 初始堆内存为:物理内存的1/64 -Xmx 最大堆内存为:系统物理内存的 1/4

    打印JVM默认参数

    使用 -XX:+PrintCommandLineFlags 打印出JVM的默认的简单初始化参数

    比如我的机器输出为:

    -XX:InitialHeapSize=266376000 -XX:MaxHeapSize=4262016000 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC 
    

    生活常用调优参数

    • -Xms:初始化堆内存,默认为物理内存的1/64,等价于 -XX:initialHeapSize
    • -Xmx:最大堆内存,默认为物理内存的1/4,等价于-XX:MaxHeapSize
    • -Xss:设计单个线程栈的大小,一般默认为512K~1024K,等价于 -XX:ThreadStackSize
      • 使用 jinfo -flag ThreadStackSize 会发现 -XX:ThreadStackSize = 0
      • 这个值的大小是取决于平台的
      • Linux/x64:1024KB
      • OS X:1024KB
      • Oracle Solaris:1024KB
      • Windows:取决于虚拟内存的大小
    • -Xmn:设置年轻代大小
    • -XX:MetaspaceSize:设置元空间大小
      • 元空间的本质和永久代类似,都是对JVM规范中方法区的实现,不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存,因此,默认情况下,元空间的大小仅受本地内存限制。
      • -Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal
      • 但是默认的元空间大小:只有20多M
      • 为了防止在频繁的实例化对象的时候,让元空间出现OOM,因此可以把元空间设置的大一些
    • -XX:PrintGCDetails:输出详细GC收集日志信息
      • GC
      • Full GC

    GC日志收集流程图

    在这里插入图片描述

    我们使用一段代码,制造出垃圾回收的过程

    首先我们设置一下程序的启动配置: 设置初始堆内存为10M,最大堆内存为10M

    -Xms10m -Xmx10m -XX:+PrintGCDetails
    

    然后用下列代码,创建一个 非常大空间的byte类型数组

    byte [] byteArray = new byte[50 * 1024 * 1024];
    

    运行后,发现会出现下列错误,这就是OOM:java内存溢出,也就是堆空间不足

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at com.moxi.interview.study.GC.HelloGC.main(HelloGC.java:22)
    

    同时还打印出了GC垃圾回收时候的详情

    [GC (Allocation Failure) [PSYoungGen: 1972K->504K(2560K)] 1972K->740K(9728K), 0.0156109 secs] [Times: user=0.00 sys=0.00, real=0.03 secs] 
    [GC (Allocation Failure) [PSYoungGen: 504K->480K(2560K)] 740K->772K(9728K), 0.0007815 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    [Full GC (Allocation Failure) [PSYoungGen: 480K->0K(2560K)] [ParOldGen: 292K->648K(7168K)] 772K->648K(9728K), [Metaspace: 3467K->3467K(1056768K)], 0.0080505 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
    [GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] 648K->648K(9728K), 0.0003035 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] [ParOldGen: 648K->630K(7168K)] 648K->630K(9728K), [Metaspace: 3467K->3467K(1056768K)], 0.0058502 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
    Heap
     PSYoungGen      total 2560K, used 80K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
      eden space 2048K, 3% used [0x00000000ffd00000,0x00000000ffd143d8,0x00000000fff00000)
      from space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
      to   space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
     ParOldGen       total 7168K, used 630K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
      object space 7168K, 8% used [0x00000000ff600000,0x00000000ff69dbd0,0x00000000ffd00000)
     Metaspace       used 3510K, capacity 4500K, committed 4864K, reserved 1056768K
      class space    used 389K, capacity 392K, committed 512K, reserved 1048576K
    

    问题发生的原因:

    因为们通过 -Xms10m 和 -Xmx10m 只给Java堆栈设置了10M的空间,但是创建了50M的对象,因此就会出现空间不足,而导致出错

    同时在垃圾收集的时候,我们看到有两个对象:GC 和 Full GC

    GC垃圾收集

    GC在新生区

    [GC (Allocation Failure) [PSYoungGen: 1972K->504K(2560K)] 1972K->740K(9728K), 0.0156109 secs] [Times: user=0.00 sys=0.00, real=0.03 secs]
    

    GC (Allocation Failure):表示分配失败,那么就需要触发年轻代空间中的内容被回收

    [PSYoungGen: 1972K->504K(2560K)] 1972K->740K(9728K), 0.0156109 secs]
    

    参数对应的图为:
    在这里插入图片描述

    Full GC垃圾回收

    Full GC大部分发生在养老区

    [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] [ParOldGen: 648K->630K(7168K)] 648K->630K(9728K), [Metaspace: 3467K->3467K(1056768K)], 0.0058502 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
    

    在这里插入图片描述

    规律:

    [名称: GC前内存占用 -> GC后内存占用 (该区内存总大小)]
    

    当我们出现了老年代都扛不住的时候,就会出现OOM异常

    -XX:SurvivorRatio

    调节新生代中 eden 和 S0、S1的空间比例,默认为 -XX:SuriviorRatio=8,Eden:S0:S1 = 8:1:1

    加入设置成 -XX:SurvivorRatio=4,则为 Eden:S0:S1 = 4:1:1

    SurvivorRatio值就是设置eden区的比例占多少,S0和S1相同

    Java堆从GC的角度还可以细分为:新生代(Eden区,From Survivor区合To Survivor区)和老年代
    在这里插入图片描述

    • eden、SurvivorFrom复制到SurvivorTo,年龄 + 1

    首先,当Eden区满的时候会触发第一次GC,把还活着的对象拷贝到SurvivorFrom去,当Eden区再次触发GC的时候会扫描Eden区合From区域,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域(如果对象的年龄已经到达老年的标准,则赋值到老年代区),通知把这些对象的年龄 + 1

    • 清空eden、SurvivorFrom

    然后,清空eden,SurvivorFrom中的对象,也即复制之后有交换,谁空谁是to

    • SurvivorTo和SurvivorFrom互换

    最后,SurvivorTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区,部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认为15),最终如果还是存活,就存入老年代

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8c38wCiH-1603971850399)(images/image-20200323150946414.png)]

    -XX:NewRatio(了解)

    配置年轻代new 和老年代old 在堆结构的占比

    默认: -XX:NewRatio=2 新生代占1,老年代2,年轻代占整个堆的1/3

    -XX:NewRatio=4:新生代占1,老年代占4,年轻代占整个堆的1/5,NewRadio值就是设置老年代的占比,剩下的1个新生代

    新生代特别小,会造成频繁的进行GC收集

    -XX:MaxTenuringThreshold

    设置垃圾最大年龄,SurvivorTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区,部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认为15),最终如果还是存活,就存入老年代

    这里就是调整这个次数的,默认是15,并且设置的值 在 0~15之间

    查看默认进入老年代年龄:jinfo -flag MaxTenuringThreshold 17344

    -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻对象不经过Survivor区,直接进入老年代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大的值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概念

    展开全文
  • JVM 参数 调优

    2021-03-04 10:46:02
    * JVM参数调优: * 查看某个正在运行程序jvm某个参数是否开启布尔型参数: jinfo -flag 配置项 进程编号 * Idea-terminal:1 jps -l (获得进程编号) 2 jinfo -flag PrintGCDetails 进程编号 3+表示开启 -表示未...
    /**
    *
    * JVM参数调优:
    *  查看某个正在运行程序jvm某个参数是否开启布尔型参数: jinfo -flag 配置项 进程编号
    *  Idea-terminal:1 jps -l  (获得进程编号) 2 jinfo -flag PrintGCDetails 进程编号 3+表示开启 -表示未开启
    *
    *  查看个正在运行程序jvm参数:jinfo -flags  进程编号
    *  Idea-terminal:1 jps -l  (获得进程编号) 2 jinfo -flags 进程编号
    *
    *  IDEA: RUN--EDIT CONFIGURATIONS--APPLICATION:HelloGC--CONFIGURATIONS:VM OPTIONS 设置为 -Xms1024  -Xmx1024  -XX:+UseParallelGC
    *  -Xms -Xmx 是XX参数,等同于-XX:InitialHeapSize -XX:MaxHeapSize
    *
    *
    *
    *
    * JVM参数查看:
    * 1 java -XX:+PrintFlagsInitial -version
    *  如何查看jvm初始参数设置:
    *  Idea-terminal:java -XX:+PrintFlagsInitial -version
    * 2 java -XX:+PrintFlagsFinal -version
    * 如何查看jvm修改后参数设置:
    * Idea-terminal:java -XX:+PrintFlagsFinal -version (“=”表示jvm默认加载的;前面有“:=”表示加载时jvm或者人为改过了。)
    *cmd运行java命令的同时打印出参数公式:
    *          cmd至java文件目录输入:java -XX:+PrintFlagsFinal -Xss128k T  (T表示运行的java类名字,表示运行java程序的同时,初始化Xss为128k,并打印出修改后的参数列表)
    *
    *3 java -XX:+PrintCommandLineFlags -version
    * 如何查看默认的垃圾收集器:
    * Idea-terminal:java -XX:+PrintCommandLineFlags -version
    *
    *
    *
    *
    *java程序中打印java虚拟机内存总量: Runtime.getRuntime().totalMemory() 默认机器内存的1/64
    *java程序中打印java虚拟机试图使用的最大内存量:Runtime.getRuntime().maxMemory() 默认机器内存的1/4
    *
    *
    *jvm常用参数:
    * 1-Xms:初始大小内存,默认物理内存的1/64 等价-XX:InitialHeapSize
    *
    * 2-Xmx:最大分配内存,默认物理内存的1/4 等同-XX:MaxHeapSize
    *
    * 3-Xss:设置单个线程栈的大小,一般默认512k-1024k 等价-XX:TreadStackSize  查看时为0,因为windows这个默认值跟虚拟机内存有关。Linux(64bit)为1024;
    *
    * 4-Xmn:设置年轻代大小,一般默认堆空间1/3,一般不调。eden8/10.from1/10.old1/10
    *
    * 5-XX:MetaspaceSize:元空间  元空间的本质跟永久代类似,都是对jvm方法区的实现,区别是元空间用的是本地内存,永久代用的是jvm内存。默认情况下元空间大小受本地内存限制。但实际情况是默认21MB
    *                    -Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal
    *
    * 6-XX:PrintGCDetails:输出详细GC收集日志;GC规律如图;FULL GC规律: 名称:GC前内存占用->GC后内存占用(该区域内存的总大小)
    *
    * 7-XX:SurvivorRatio:设置新生代eden和S0/S1空间的比列。默认:-XX:SurvivorRatio=8,eden:s0:s1=8:1:1 如果-XX:SurvivorRatio=4,则eden:s0:s1=4:1:1
    *
    * 8-XX:NewRatio:配置young和old在堆内存的占比,默认=2,young占1/3,young/old=1/2,-XX:NewRatio=4,则young占1/5,young/old=1/4
    *
    * 9-XX:MaxTenuringThreshold:old区最大吞吐量,就是垃圾最大年龄,进入老年代年龄,默认15,值域1-15.值越大,进去old的条件越高,触发FULL GC的条件越高。如果为0,则eden不进入survivor区,直接进old。
    *
    *
    */
    展开全文
  • JVM 参数调优

    2019-07-15 22:15:08
    JVM 参数调优 启动命令:java -server -Xms32m -Xmx32m -jar maven_demo-1.0-SNAPSHOT.jar 查看进程信息:

    JVM 参数调优

    启动命令:java -server -Xms32m -Xmx32m -jar maven_demo-1.0-SNAPSHOT.jar
    在这里插入图片描述
    查看进程信息:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化).zip
  • JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化),供大家查阅!!!!!!!!!!!!!!
  • Java JVM参数调优配置

    2020-08-12 11:00:08
    JVM参数调优
  • 【JVM实战】JVM参数调优

    千次阅读 2020-03-30 14:45:24
    文章目录JVM参数调优一、调优基本概念二、常用JVM参数三、GC调优思路 JVM参数调优 一、调优基本概念 在调整性能时,JM有三个组件 堆大小调整 垃圾收集器调整 JIT编译器调整 大多数调优选项都与调整堆大小和选择的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,031
精华内容 2,012
关键字:

jvm参数调优