编程笔记jvm

JVM 参数怎么调

2020-05-31  本文已影响0人  老瓦在霸都

基于 JVM 的语言和应用程序汗牛充栋,不仅限于 Java , 还有 Scala , JPython, JRuby。对于 JVM 的调优是每个JVM 应用开发者必需要了解的。

先回顾一下 JVM 的结构

JVM 结构

JVM structure

堆内部的分代

JVM Heap

JVM 参数调优

JVM 参数既多且杂,如何提纲挈领,避免挂一漏万呢?个人的想法是掌握原理,了解常用的参数就好了,以度量来驱动适用于你的应用程序的参数设置。

    -Xms2048m
    -Xmx2048m
    -XX:MetaspaceSize=128m
    -XX:MaxMetaspaceSize=256m
    -XX:CompressedClassSpaceSize=256m
    -Xss1m
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-XX:+PrintHeapAtGC 
-XX:+PrintTenuringDistribution 
-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintPromotionFailure 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=10M 
-Xloggc:./bin/../logs/gc.log
-XX:OnOutOfMemoryError="sh ./bin/oom-hander.sh"

常用JVM 调优参数

实例

以 Cassandra 为例,它是的一个高性能的分布式NOSQL 数据存储系统,它设置了如下 JVM 参数:

bin/java -Xloggc:./bin/../logs/gc.log 
-ea 
-XX:+UseThreadPriorities 
-XX:ThreadPriorityPolicy=42 
-XX:+HeapDumpOnOutOfMemoryError 
-Xss256k 
-XX:StringTableSize=1000003 
-XX:+AlwaysPreTouch 
-XX:-UseBiasedLocking 
-XX:+UseTLAB 
-XX:+ResizeTLAB 
-XX:+UseNUMA 
-XX:+PerfDisableSharedMem 
-Djava.net.preferIPv4Stack=true 
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled 
-XX:SurvivorRatio=8 
-XX:MaxTenuringThreshold=1 
-XX:CMSInitiatingOccupancyFraction=75 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:CMSWaitDuration=10000 
-XX:+CMSParallelInitialMarkEnabled 
-XX:+CMSEdenChunksRecordAlways 
-XX:+CMSClassUnloadingEnabled 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-XX:+PrintHeapAtGC 
-XX:+PrintTenuringDistribution 
-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintPromotionFailure -XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=10M 
-Xms4096M 
-Xmx4096M 
-Xmn800M 
-XX:+UseCondCardMark 
-XX:CompileCommandFile=./bin/../conf/hotspot_compiler 
-javaagent:./bin/../lib/jamm-0.3.0.jar 
-Dcassandra.jmx.local.port=7199 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password 
-Djava.library.path=./bin/../lib/sigar-bin 
-XX:OnOutOfMemoryError=kill -9 %p 
-Dlogback.configurationFile=logback.xml 
-Dcassandra.logdir=./bin/../logs 
-Dcassandra.storagedir=./bin/../data 
-Dcassandra-foreground=yes 
-cp ./bin/../conf:./bin/../build/classes/main:./bin/../build/classes/thrift:...jar: org.apache.cassandra.service.CassandraDaemon

监控与观察

一般来说,比较常用的方法是通过 JMX 和 GC log 来度量你的 JVM 参数设置是是否合理,一旦发现异常或者 OOM 要马上采取措施进行调整

jstat -gcutil 1324
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00  15.10   7.84  97.24  92.57      2       0.017     1      0.034    0.051

关于 JVM 内存溢出的分析可以参考以前写的 内存溢出不可怕,手足无措才尴尬

参考资料

上一篇下一篇

猜你喜欢

热点阅读