jvm性能优化

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

上一篇:jvm参数优化

代码交流 2021