1.性能优化指标
预期吞吐量、预期响应延迟、最大并发数、并发数最大时可接受的吞吐量和延迟、最坏延迟、垃圾收集对延迟的影响
2.性能分析的方法:自顶向下、自底向上
3.操作系统性能监控
1)cpu使用率:vmstat top
监控信息:用户态%、系统态%、io等待时间%、空闲时间%、运行队列
2)内存使用率:free vmstat(si so)
3)锁竞争:pidstat -w
4)网络IO:nicstat
5)磁盘IO:iostat iotop dstat
4.JVM概述
1)hotspot三组件:Runtime JIT MM (2个JIT[server client]和一个解释器)
2)提高CPU缓存命中率(Ordinary Object Pointers) -XX:+UseCompressedOops
3)VM类加载:类加载阶段(加载、链接、初始化)、类加载委派、启动类加载器(client模式下加速加载,类数据共享 -Xshare:on/off)、类型安全、hotspot类元数据、内部的类加载数据
4)偏向锁:-XX:+UseBiasedLocking
5)错误显示:-XX:+ShowMessageBoxOnError
-XX:OnOutOfMemeryError=<cmd> -XX:+HeapDumpOnOutOfMemery -XX:HeapDump- Path=<path>
6)垃圾收集器
分代垃圾收集:存活时间和对象引用
新生代:Eden、Survivor(from to),minorGC过程中,当to的空间不足时则过早提升,甚至造成晋升失败而进行fullGC,Eden区域使用了指针碰撞,只需检测top到Eden end之间的容量即可,在Eden区中有一小块内存TLAB避免安全加锁影响分配性能。
老年代、永久代
垃圾收集器分类:
Serial:新生代复制算法,老年代标记-压缩,串行方式stop-the-world
Parallel(Throughput):吞吐量为先,新生代复制算法,老年代标记-清除,并行的方式进行GC
Mostly-Concurrent:低延迟为先,CMS收集器,新生代依然同于上2种,而老年代中尽量与用户线程并发工作
初始标记-预清除-重新标记-并发清除(每个动作都是并发的)
由于空闲空间不是连续的,所以必须有空闲列表进行记录,这对MinorGC造成了开销,晋升时候都的在old区进行内存分配,都得记录到空闲列表。
Garbage-First:将堆分成相同尺寸的region,region中垃圾堆积的价值、优先列表、Remenbered Set
7)应用程序对收集器的影响
内存分配、存活数据量、老年代中的更新
8)编译器
解释器->编译器 (引用计数器和回边计数器)
Client JIT和Server JIT
混合JIT:-server -XX:+TieredCompilation
9)自适应调优
-XX:+PrintCommandLIneFlags查看自动优化参数
5.JVM性能监控
1)垃圾收集
-XX:+UseParalleGC/-XX:+UseParallelOldGC时,可带参数-XX:-ScavengeBeforeFullGC可在FullGC前不惊醒MinorGC
-XX:+PrintGCDetails -verbose:gc
-XX:+UseConcMarkSweepGC 使用CMS收集器
监控晋升分布:-XX:+PrintTenuring-Distribution
-XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -xloggc:<filename>
应用并发时间和应用停止时间:
-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime
安全点:-XX:+PrintSafepointStatistics
2)图形化工具
jconsole:启动应用是加上参数 -Dcom.sun.management.jmxremote
visualVM:远程监控需要策略文件jstatd.policy
grant codebase "file:${java.home}/../lib/tool.jar" {
permission java.security.AllPermission;
}
jstat -J -Djava.security.policy=/absolutePath/jstatd.policy
jps remote_hostname
JMX: com.sun.management,jmxremote.port/ssl[true | false]/authenticate[true | false]
3)JIT编译器
编译器监控:-XX:+PrintCompilation
4)类加载:永久代
-XX:PermSize -XX:MaxPermSize
5)Mbean进行应用监控
6.java性能分析
1)工具:http://developer.51cto.com/art/201204/327130.htm http://www.ibm.com/developerworks/cn/java/j-lo-profiling/index.html?ca=drs-
2)性能优化的机会:使用更高效的算法、减少锁竞争、为算法生成更有效的代码
3)应用程序的系统需求
可用性、可管理性、延迟及响应性、内存占用、启动时间
4)JVM运行模式
-server(复杂的生成代码优化功能) -client(启动快,内存小) 混合模式
5)垃圾收集器调优
性能属性:吞吐量、延迟、内存占用
原则:MinorGC垃圾收集最大化、GC内存最大化、GC调优3选2(吞吐量、延迟、内存)
6)确定内存占用
活跃数据:长期存活对象或FullGC后还活着的对象
堆大小设置成老年代活跃数据的3~4倍 -Xms -Xmx
新生代设置成老年代活跃数据的1~1.5倍
永久代是永久代的活跃数据1.2~1.5 -XX:PermSIze=n -XX:MaxPermSIze=n
7)延迟调优
分别统计MinorGC和FullGC的时间和次数
-XX:SurvivorRatio=<ratio>
-XX:MaxTenuringThreshold=<n>
-XX:CMSInitiatingOccupancyFraction=<percent>
-XX:+UseCMSInitatingOccupancyOnly
禁止显示GC:-XX:ExplicitGCInvokerConcurrent -XX:ExplicitGCInvokerConcurrentAndUnloadsClasses
CMS永久代垃圾收集:
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
-XX:CMSInitiatingPermOccupancyFraction=<percent>
-XX:+UseCMSInitatingOccupancyOnly
重新标记使用线程数:-XX:ParallelGCThreads=<n>
-XX:+CMScavengeBeforeRemark -XX:+ParallelRefProcEnabled
8)实验性最大优化:-XX:+AggressiveOpts
9)逃逸分析:-XX:+DoEscapeAnalysis
10)偏向锁:-XX:UseBiasedLocking
12)大页面:-XX:+UseLargePages
7.java多线程实现:通过线程轮询将线程分配给处理器执行。
-XX:+PrintFlagsFinal -XX:+PrintFlagsInitial
-XX:MaxDirectMemorySize -verbose:class -XX:TraceClassLoading -XX:TraceClassUnloading
-XX:PreTenuringSizeThreshold=xxx
8.垃圾收集算法和收集器
Mark-sweep Copying Mark-Compact Generational-Collection
Serial/Serial Old ParNew Parallel Scavenge/Parallel Old(Throghput) CMS G1
9.工具
jps jstat jinfo jmap jhat jstack jconsole visualvm