编程语言
首页 > 编程语言> > Java应用性能分析与调优实践

Java应用性能分析与调优实践

作者:互联网

性能问题表象就是应用系统运行慢,影响客户体验。要解决性能问题也无非就是找到原因然后根据原因对症下药。本文从这两方面概述Java应用性能分析与调优方法论。

一、定位性能差的原因

1、借助工具:YourKit (类似的还有JProfiler,个人倾向YourKit),YourKit 是收费的,但是对于聪明的你来说不是问题,你懂的。YourKit 帮助文档非常详细,而且还有视频指导。

2、应用场景:

(1)应用系统在服务器端(比如Linux系统),我们需要在服务器上安装对应操作系统的YourKit ,然后使用YourKit 启动应用系统,然后去系统界面操作相关业务,YourKit 会录下一个日志,然后把这个日志文件给开发人员进行分析,这个一般是产品已经上线或试运行阶段;

安装YourKit后,使用integrate.sh经过若干步骤生成集成参数,类似下面:

 

 

 

-agentpath:/usr/local/YourKit-JavaProfiler-2020.9/bin/linux-x86-64/libyjpagent.so=disablestacktelemetry,delay=10000,port=12345,listen=localhost

添加到java启动参数后面启动即可:

java -Xms768m -Xmx4096m -Djava.net.preferIPv4Stack=true -Dloader.path=./target/lib -jar ./target/test.jar -agentpath:/usr/local/YourKit-JavaProfiler-2020.9/bin/linux-x86-64/libyjpagent.so=disablestacktelemetry,delay=10000,port=12345,listen=localhost

 

 

(2)使用IDE本地运行应用直接分析,这个用于开发阶段

 

 

 

 

 注意:使用Profile启动且使用Trace模式分析,不要使用Attach附加方式分析,因为Attach方式下YourKit 有些功能不能使用 导致分析数据不全。

二、调优

总体策略:空间 换 时间。

发生性能问题的原因很多种

比如:

(1)SQL查询慢,进行SQL优化,比如增加索引等;

(2)常用数据反复查询:引入缓存,将常用数据放入缓存;

(3)复杂业务处理:12模式并发编程

(4)高并发:增加应用服务器、数据库服务器(分库分表、读写分离等)

 我们这里不讨论(1)(2)(4),这三种网上文章很多,而且(1)(2)比较简单,(4)一版架构师都做好了,业务开发人员无需关注。我们着重讨论(3),基本上所有开发人员都会涉及。

三、多线程设计模式

为了提高代码执行效率而引入并发编程,但是并发编程会带来数据安全、死锁等问题,需要一套方法论来规范使用并发编程。
(1)Immutable Object不可变对象模式:在不引入锁的条件下,能保证访问共享变量时是线程安全的,缺点是会频繁的创建变量。(案例2-4)
(2)Guarded Suspension保护性暂挂模式:将线程间的等待与唤醒规范化(案例5-7)
(3)Two-phase Termination两阶段终止模式:优雅的终止run方法的执行,让其有做一些收尾工作的可能。(案例8-11)
(4)Promise承诺模式:能优雅的让当前线程获取到另一个线程的执行结果。(案例12-14)
(5)生产者/消费者模式:让输入逻辑和输出逻辑解耦,让两端易于维护。(案例15-18)
(6)Active Object主动对象模式:为了保证系统的吞吐量,让其真正的执行请求异步化,请求将成为一个任务对象,放入缓冲区,让其他线程来处理。(案例19-21)
(7)Thread Pool线程池模式:避免线程资源的频繁创建与销毁导致的性能损耗,同时也是对线程的开辟数量进行管控。(案例22-25)
(8)Thread Specific Storage线程特有存储模式:让每个线程都拥有一份相同全局变量的副本,避免了线程安全问题,只不过可能导致内存泄漏。(案例26-28)
(9)Serial Thread Confinement串行线程封闭模式:将并发任务串行化,交由统一的线程去处理,保证线程安全。(案例29-30)
(10)Master-Slave主仆模式*:将一个任务切分成多个子任务,并且由一个主任务对其他子任务负责管控,分而治之确保执行效率。(案例31-33)
(11)Pipeline流水线模式*:让有依赖关系的子任务进行任务编排,能够顺利的并行执行。(案例34-37)
(12)半同步/半异步模式*:将原有任务按执行效率高低,进行子任务的拆分,从而保证系统的整体的执行效率。(案例38-40)
多线程设计模式真正要解决的问题核心就两个:确保任务的执行效率与确保数据的线程安全。另外,一种设计模式想要真正落地,很大程度上必须同时杂糅多种其他设计模式的思想。通过学习吸取到的是设计模式解决问题的思想,不要纠结于一种模式应该以什么样的形式呈现,利用模式传递的思想,解决问题才是最重要的,并发编程是一件比较复杂的事情,通过本课程的学习,最多也只能让你们了解到并发编程一些内功心法。

 

参考:

YourKit官网

 

标签:Java,并发,YourKit,实践,模式,案例,调优,线程,设计模式
来源: https://www.cnblogs.com/cac2020/p/16356206.html