JAVA性能调优

一.性能分析:
1.CPU消耗分析
        在Linux中,可通过top命令来查看CPU消耗状况。


14.9%us 表示用户进程处理所占的百分比
0.7%sy 表示内核线程处理所占的百分比
0.0%ni 表示被nice命令改变优先级的任务所占百分比
84.3%id 表示CPU空闲时间所占的百分
0.0%wa 表示在执行过程中等待IO所占的百分比
0.0%hi 表示硬件中断所占的百分比
0.0%si 表示软件中断所占的百分比
java应用而言,CPU消耗严重主要体现在us 、sy两个值上
    (1)当us值过高时,表示运行的应用消耗了大部分的CPU;
    (2)当sy 值高时,表示 Linux花费了太多的时间在上下文切换上,
   Java应用造成这种情况的原因是启动的线程比较多,且这些线程多数处于要不断阻塞(例如锁等待,IO等待)和执行状态变化过程中,这就导致了操作系统需要不断地切换执行线程,产生大量的上下文切换。
2.文件IO消耗分析
    在查看Linux内存状况时,经常会发现可用(free)的物理内存不多,但是 cached 用了很多,这是Linux提升文件IO速度的一种做法
3.网络IO消耗分析
    在Linux中可采用sar来分析网络IO的消耗状况
4.内存消耗分析
    Java内存的消耗主要是在JVM堆内存上,在正式环境中,多数Java应用都会讲-Xms和-Xmx设置为相同的值,避免运行期间不断地申请内存
5.程序执行慢的原因分析
    (1)锁竞争激烈:假设连接池提供了10个连接,但如果此时有50个 线程要进行数据库操作,那么就会造成另外的40个线程处于等待状态。
    (2)未充分使用硬件资源,例如机器是四核的,但程序都是单线程串行操作,并没有充分发挥硬件资源的作用
    (3)数据量增长,例如数据库数据量从100w涨到1000w
二.调优
1.JVM调优
    JVM调优主要是内存管理方面你的调优,包括各个代大小,GC策略等。由于GC会影响应用线程,严重影响性能,这些调优对于应用而言还是很重要的
2.代大小调优
    通常Minor GC会远快于Full GC,因为Minor GC 采用的是标记复制算法,Full GC采用的是标记整理/标记清除算法
    代大小调优上,最关键的参数有以下几点:
Xms,-Xmx 通常设置为相同的值,避免运行时要不断地扩展JVM内存空间,这个值决定了Heap所使用的最大空间。
-Xmn 决定了新生代(New Generation)空间的大小。
-XX:SurvivorRatio 是控制新生代Eden、S0、S1三个区域的比率,例如比值是 8:1:1 时
-XX:MaxTenuringThreshold 控制对象在经历多少司Minor GC 后才转入老年代,通常又将此值成为新生代存活周期,此参数只有在串行GC(-XX:+UseSerialGC)时有效,其他GC方式则有Sun JDK自行决定。
当新生代过小时,Minor GC的次数更加频繁,大对象更容易进入老年代,从而触发Full GC。
当新生代过大时,老年代变小,有可能导致Full GC频繁,Minor GC耗时也会增加。
当Survivor Space(S0/S1)过大时,Minor GC次数增加,大对象不容易进入老年代。过小时,Minor GC次数变少,但大对象更容器直接进入老年代。
当新生代存活周期数增加,对象在Minor GC阶段回收的机会就增加了,但是Survivor Space 更容易被占用。
3.GC策略调优
    串行GC性能较差,像 Serial 在收集和复制时都是一个线程,Parallel 在收集是多个线程,复制时是一个线程,一般都不会使用Serial  GC
4.程序调优
    (1)CPU消耗严重,当us 高说明执行线程无任何挂起动作,且一直执行,对于这种情况,可以在方法中增加Thread.sleep,释放CPU的执行权
    当sy 高说明线程切换太过频繁,最简单的优化就是减少线程数。也可以减少线程间通信,降低锁竞争,或者采用协程代替线程。
    (2)IO消耗严重
        异步写文件
        批量读写
        限流
        限制文件大小
    (3)网络IO消耗严重
        限流,限制发送packet的频率。
    (4)内存消耗严重
        释放不必要的引用
        使用对象缓存池
        采用合理的缓存时效方法(FIFO,LRU,LFU)
        合理使用SoftReference和WeakReference(前者在内存不够用的时候回收,后者在Full GC时立刻回收)
5.资源消耗少,程序运行慢调优
    (1)锁竞争激烈容易导致CPU sy,即系统上下文切换频繁导致内核线程运行占比较高
    解决方法:
        使用无阻塞的并发类实现阻塞式的并发类(基于CAS ),例如使用ConcurrentLinkedQueue来代替BlockingQueue。
        尽量少用锁
        拆分锁
    (2)未充分使用CPU,多用并行处理
三.JVM调优常用参数命令
1.输出日志
以下含义分别是 输出GC信息,输出GC简要信息,输出GC详细信息,输出GC的时间信息,输出GC造成的应用暂停时间,将GC日志输出到gc.log文件中
-verbose:gc -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:gc.log
2.jmap -heap pid
MinHeapFreeRatio对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40),MaxHeapFreeRatio对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
3.jstat -gc pid
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
 

 

        
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值