分类 Java 相关 下的文章

JVM 常见的启动参数 flags

//jit 编译器类型

  • -client //32位 client, 启动早, 编译不耗时
  • -server //32位 server, 启动晚, 编译耗时, 最终代码更优化,更快
  • -d64 //64位
  • -XX: TieredCompilation //必须使用 server 编译器, 先 client, 再 server 重新编译
  • -XX:InitialCodeCacheSize=N //初始 code cache 值, 可以通过 jconsole 查看
  • -XX:ReservedCodeCacheSize=N //最大 code cache 值

//编译开始的 threshold, 不是全局累加计数, 而是移动区间计数

  • -XX:PrintComplilation //打印编译日志 可以通过 jstat 查看编译的统计信息或 jconsole
  • -XX:CompileThreshold=N //是否启动编译的 threshold (方法调用计数器 循环回边计数器)
  • -XX:OnStackReplacePercentage=N //OSR 的 threshold 值, 需要通过公式计算次数
  • -XX:CICompilerCount=N //编译器的线程数
  • -XX:Printflagsfinal 启动时打印所有标志 flags;
  • -XX:+Inline //内联 默认是 true
  • -XX:+DoEscapeAnalysis //逃逸分析 默认是 true

//GC refer: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html

  • -XX:+UseSerialGC
  • -XX:+UseParallelGC
  • -XX:-UseParallelOldGC
  • -XX:+UseConcMarkSweepGC
  • -XX:+UseParNewGC
  • -XX:+UseG1GC

//GC log refer: https://dzone.com/articles/enabling-and-analysing-the-garbage-collection-log

  • -XX:+PrintGC
  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps
  • -XX:+PrintGCDateStamps
  • -Xloggc:
  • -XX:+PrintGCApplicationStoppedTime
  • -XX:+PrintGCApplicationConcurrentTime
  • -XX:+UseGCLogFileRotation
  • -XX:NumberOfGCLogFiles=5
  • -XX:GCLogFileSize=2000k
  • -XX:ParallelGCThreads=N //并发启动的GC 回收线程数目
  • -XX:+DisableExplicitGC

//heap related

  • -Xms //heap start eg: -Xms3000m
  • -Xmx //heap max eg: -Xmx:4000m
  • -XX:NewRatio=N //新生代和老年代占比用比率, default 2. 新生代大小=总堆大小/(1+NewRatio)
  • -Xns //Nursery Start eg: -Xns800m
  • -XX:NewSize=N //新生代初始大小
  • -XX:MaxNewSize=N //新生代最大值
  • -XX:PermSize=N //永久带初始大小
  • -XX:MaxPermSize=N //永久带最大值
  • -XX:MetaspaceSize=N //java8 元空间初始大小
  • -XX:MaxMetaSpaceSize=N //java8 元空间最大值
  • -XX:+PrintAdaptiveSizePolicy //打印自适应策略相关信息
  • -XX:+UseAdaptiveSizePolicy //使用自适应策略. 若xms,xmn,xns固定死,则不使用

//JFR

  • -XX:UnlockCommercialFeatures
  • -XX:+flightRecorder

官方文档: https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#PerformanceTuning

作为服务器运行的 JVM 最好设置下面这些参数:

-Xms<heap size>[g|m|k] 
-Xmx<heap size>[g|m|k]
-XX:MaxMetaspaceSize=<metaspace size>[g|m|k]
-Xmn<young size>[g|m|k]

-Xloggc:"<path to log>"
-XX:+PrintGCDetails 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=10M
-XX:+PrintGCDateStamps 

-Dsun.net.inetaddr.ttl=<TTL in seconds>

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=<path to dump>`date`.hprof

jdk 自带工具集

  • jps 列出当前用户的java 进程
    jps
    jps -v
    jps -l
  • jcmd 打印 jvm 的基本类, 线程, VM等信息. 查看 GC 参数, JVM系统变量, 参数 flags, VM 参数存活时间,
    做 dump, 打开商业 feature 等. jcmd help;

jcmd pid help
jcmd pid GC.heap_dump help
jcmd pid GC.heap_dump /tmp/heap.hprof
一般支持如下操作:

VM.native_memory
GC.rotate_log
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
Thread.print
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
  • jmap 产生 heap dump, 打印 histogram 和永久带统计 permanent generation statistics;

    jmap -histo 23383
    jmap -histo:live 23383
    jmap -permstat 23383 //perm gen statistic
    jmap -dump:live,format=b,file=/tmp/heap.hprof 23383

  • jhat 读取 heap dump 进行分析,启动 web 端口, 供查看;
  • jinfo 查看 JVM 系统属性, 并可以设置某些信息, 参数等

    -flag to print the value of the named VM flag
    -flag [+|-] to enable or disable the named VM flag
    -flag = to set the named VM flag to the given value
    -flags to print VM flags
    -sysprops to print Java system properties

  • jstack 产生 thread dump, 或打印 thread 锁的情况;

    jstack -l 23383 > /tmp/thread.log //long listing. Prints additional information about locks
    jstack 23383
    jstack -F 23383 //force stack dump
    jstack -m 23383 //to print both java and native frames (mixed mode)

  • jstat JVM 监控统计信息, 如 GC, jit编译器, 类等;

    jstat -options //list options
    jstat -gccause 23383 1s 3 //for pid 23383, print gccause 3 times, interval is 1s
    jstat -printcompilation 23383 1s 3
    jstat -gcutil 23383 1s 3

  • jconsole 图形化 JVM 线程, 类, 内存, GC 等情况;
  • jvisualvm 监视 JVM 的图形工具, 抓取和分析 dump;
  • JMC JMissionControl 图形化 JFR analysis

基于 Java 的互联网应用 应该监控那些指标

  • 操作系统层面
  1. cpu 使用率;
  2. 内存使用率;
  3. 磁盘使用情况;
  4. 网络使用情况;

    • JVM 层面
  5. Jvm cpu 使用情况;
  6. gc overhead;
  7. gc count;
  8. gc 每次回收后的使用情况;
  9. jfr 的重要指标;
  10. Jvm memory available;
  11. oom error count;

    • 应用框架层面
  12. 作为 service client 调用下游时候的 成功/失败次数, 平均时间;
  13. 调用外部数据存储的 成功/失败次数, 平均时间;

    • 应用层面
  14. tps/ops;
  15. transaction time;
  16. 5xx count;
  17. 4xx count;
  18. app busy threads;
  19. app total thread count;
  20. error count;