一、Java应用调优的关键指标
调优之前首先我们要知道怎样才算是“优”,不能笼统的说我的程序性能很好,所以就需要有一个具体的指标来衡量性能情况,而在JVM里面衡量性能两个指标分别“吞吐量”和“停顿时间”。
吞吐量
程序运行过程中执行两种任务,分别是执行业务代码和进行垃圾回收,吞吐量大意就是说程序运行业务代码的时间越多程序的吞吐量就越高,其计算公式 ,吞吐量 = CPU在用户应用程序运行的时间 / (CPU在用户应用程序运行的时间 + CPU垃圾回收的时间),一般而言GC 的吞吐量不能低于 95%。
停顿时间
因为JVM进行垃圾回收的时候,某些阶段必须要停止业务线程专心进行垃圾收集,停顿时间就是指JVM停止业务线程而去进行垃圾收集的这段时长,停顿时间越长就意味着用户线程等待的时间越长,停顿时间会直接影响用户使用系统的体验。
垃圾回收频率
通常来说垃圾回收频率是越低越好,垃圾收集的过程是非常占用CPU资源的,资源有限如果垃圾收集占用的资源越多那么以为着其他事情所用的资源会减少,系统所能做的事情也会越少。
当然也不能一味的追求GC次数减少,GC次数减少了有可能就会使得单次GC的时间变长,那么就可能会增加单次GC的“停顿时长”,所以需要在这两者之间做一些平衡。
如果获得这些指标?
在项目启动的时候 增加下列参数来收集收集GC日志,然后通过第三方的日志分析工具(GCesay)分析收集到的GC日志来得到吞吐量、停顿时间相关的统计数据。
java
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-XX:+UseGCLogFileRotation
-XX:+PrintHeapAtGC -XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=20M
-Xloggc:/opt/ard-user-gc-%t.log
-jar abg-user-1.0-SNAPSHOT.jar
-Xloggc:/opt/app/ard-user/ard-user-gc-%t.log 设置日志目录和日志名称
-XX:+UseGCLogFileRotation 开启滚动生成日志
-XX:NumberOfGCLogFiles=5 滚动GC日志文件数,默认0,不滚动
-XX:GCLogFileSize=20M GC文件滚动大小,需开启UseGCLogFileRotation
-XX:+PrintGCDetails 开启记录GC日志详细信息(包括GC类型、各个操作使用的时间),并且在程序运行结束打印出JVM的内存占用情况
-XX:+ PrintGCDateStamps 记录系统的GC时间
-XX:+PrintGCCause 产生GC的原因(默认开启)
确定调优的标准
小明和小芳今天都准备在家打扫卫生,小明准备花两个小时一次性把所有房间全部打扫完毕,然后剩下的时间可以去安心打游戏了。
而小芳的想法不一样,它打算每打扫一个房间就休息一会听听音乐看看电视,这样就感觉没那么累,一直能保持着愉悦的心情。那么如果是你来打扫卫生,你会选择什么样的方式呢?
我想不同的人会有不同的答案,而且谁也不能说哪个人的打扫方式是最好的,因为在这个场景里并没有最好的选