zoukankan      html  css  js  c++  java
  • 【从零单排】Java应用启动参数实例解析

    当我们自己跑一个小程序时,可以用类似java app.jar的命令直接跑。而在实际的生产/开发环境,除了classpath外,还会加上一大堆JVM运行参数。

    下面,就对一个实例进行分析:

    -Xms140G  // 最小堆
    -Xmx140G  // 最大堆
    -Xss10M   // 栈空间
    -XX:MetaspaceSize=2G  // Metaspace扩容时触发FullGC的初始化阈值
    
    -XX:MinHeapFreeRatio=10  // serial collector 使用的参数,控制Heap扩大或者收缩,不常用了
    -XX:MaxHeapFreeRatio=20 
    
    -XX:+UseStringDeduplication // JVM在做GC的同时会做重复字符串消除
    -XX:+PrintStringDeduplicationStatistics
    
    -XX:+UseG1GC  // 使用G1 GC
    -XX:+UnlockExperimentalVMOptions  // 允许使用experimental的参数
    -XX:G1HeapWastePercent=5  // Sets the percentage of heap that you are willing to waste.
    -XX:G1MixedGCLiveThresholdPercent=85  // Sets the occupancy threshold for an old region to be included in a mixed garbage collection cycle. (experimental)
    -XX:G1HeapRegionSize=32M  // Sets the size of a G1 region.
    -XX:MaxGCPauseMillis=10000  // Sets a target value for desired maximum pause time.
    -verbose:gc  // alias for -XX:+PrintGC
    -XX:+PrintGCDetails
    -XX:+PrintGCTimeStamps
    -XX:+PrintGCDateStamps
    -Xloggc:path_to_my_gc.log  // GC log 文件存放位置
    
    -Dcom.sun.management.jmxremote.port=1234  // 远程调试端口
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false
    
    -Dlog4j.configuration=file://$LOG4J_FILE  // log4j文件存放位置
    

    Xms Xmx Xss

    很重要,很重要,很重要。

    随着我们应用的业务量不断增大,Xms和Xmx也一路增长。从80G->140G。

    -Xms140G  // 最小堆
    -Xmx140G  // 最大堆
    -Xss10M   // 栈空间
    # -Xmn50G   // 年轻代
    

    Xss:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。

    Xmn:一般年轻代设置为整个堆大小的3/8。

    注:一般最小堆和最大堆设置一样,防止内存抖动(这个“抖动”的操作也是耗时的)。

    UseStringDeduplication

    这里有一个疑问,String PoolUseStringDeduplication 这两个东西功能重复吗?

    -> 当然是不重复的。

    String Pool存的是literal或者调用String.intern()的字符串。如下:

    String a = "Hello";
    String b = new String("Hello").intern();
    //System.out.println(System.identityHashCode(a) + ", " + Integer.toHexString(a.hashCode()));
    //System.out.println(System.identityHashCode(b) + ", " + Integer.toHexString(b.hashCode()));
    

    除此之外,更多的情况,String是 Runtime 生成的。比如,从DB中query出来,或者调用某个REST API接口query出来。

    String c = new String("Hello");
    String d = getFromDB();
    String e = getFromAPI();
    

    使用这个参数可以对以上所有情况去重。当然,前提是使用G1 GC。

    UseG1GC

    特别要说明的一项是MaxGCPauseMillis,默认是200miliseconds,我们这里调到了10000。

    这个参数的背后代表的意思是:每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
    因为我们的应用是吞吐量大,相应要求低,所以这里可以设大一点的值,否则年轻代过小,可能导致频繁FGC。

    其它的参数基本上都是使用的默认值。

    其它以上没列出来的常用参数

    -XX:NewSize=n:设置年轻代大小
    -XX:NewRatio=n:设置年轻代和年老代的比值为1:n。如3,表示年轻代与年老代比值为1:3
    -XX:SurvivorRatio=n:设置(两个)Survivor区和Eden区的比值为2:n。如3,表示Survivor:Eden=2:3
    -XX:MaxPermSize=n:设置持久代大小
    

    链接

  • 相关阅读:
    JSON解析
    [Git的常见使用方式]
    [二进制]原码,反码,补码
    [伪] 级联菜单,两级菜单
    [心得]Java开发中的小心得
    [纪录]仿IOS滚轮效果(竖直滑动选择器)
    web测试总结
    科目组2
    科目组
    凭证:条目视图,总账视图
  • 原文地址:https://www.cnblogs.com/maxstack/p/13778162.html
Copyright © 2011-2022 走看看