java性能调优基本原则

前言

互联网时代,一个简单的系统就囊括了应用程序、数据库、容器、操作系统、网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优化,这就是技术广度;而很多性能问题呢,又隐藏得很深,可能因为一个小小的代码,也可能因为线程池的类型选择错误,可归根结底考验的还是我们对这项技术的了解程度,这就是技术深度。显然,性能调优不是一件容易的事。

1, 影响因素:

影响性能的因素有:网路,数据库,CPU,磁盘IO,锁竞争,内存,程序本身。

2,性能调优方向:

调优方向综合介绍

开始先从应用本身下手-----》应用软件----》》》操作系统—》硬件然后再
自上而下
性能调优不是一件容易的事,协调各个部门及岗位,查看日志及监控系统地分析调优方向!
作为开发岗,只分析对应用本身的性能问题:
典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。

Java 应用性能的瓶颈点非常多,比如磁盘、内存、网络 I/O 等系统因素,Java 应用代码,JVM GC,数据库,缓存等。

Java 性能优化分为 4 个层级:应用层、数据库层、框架层、JVM 层

应用层需要理解代码逻辑,通过 Java 线程栈定位有问题代码行等;

数据库层面需要分析 SQL、定位死锁等;

框架层需要懂源代码,理解框架机制;

JVM 层需要对 GC 的类型和工作机制有深入了解,对各种 JVM 参数作用了然于胸。

3,性能调优原则(应用本身分析)

(1)减小 CPU 消耗

  • 有的应用需要大量计算,他们会长时间、不间断地占用 CPU 资源,导致其他资源无法争夺到 CPU 而响应缓慢,从而带来系统性能问题。例如,代码递归导致的无限循环,正则表达式引起的回溯,JVM 频繁的 FULL GC,以及多线程编程造成的大量上下文切换等,这些都有可能导致 CPU 资源繁忙。

  • 占用 CPU 资源多 线程数不易过多,过高导致线程上下文切换频繁,系统吞吐量反而下降。
    – 减少线程间的锁竞争,否则也可能切换过多

(2)CPU 没有充分利用

– 当线程同步文件IO,同步网络IO、锁等待、sleep时,线程被挂起,但资源不释放,考虑异步IO。

(3)减小 IO 消耗

– 避免多个线程写同一个文件
• 采用缓存区方式读写(Buffered…)
• 异步写文件,log4j的AsyncAppender
• 批量读写
• 限流(代码中控制)
• 限制文件大小
• 网络IO
– 限流,根据设计限制发送次数、数据大小等

(4)程序调用优化

– 串行调整为并行
– 同步调整为异步
– 单操作调整为批量操作

(5) 充分利用内存

Java 程序一般通过 JVM 对内存进行分配管理,主要是用 JVM 中的堆内存来存储 Java 创建的对象。系统堆内存的读写速度非常快,所以基本不存在读写性能瓶颈。但是由于内存成本要比磁盘高,相比磁盘,内存的存储空间又非常有限。所以当内存空间被占满,对象无法回收时,就会导致内存溢出、内存泄露等问题。

(6) 异常

Java 应用中,抛出异常需要构建异常栈,对异常进行捕获和处理,这个过程非常消耗系统性能。如果在高并发的情况下引发异常,持续地进行异常处理,那么系统的性能就会明显地受到影响。

(7)数据库

大部分系统都会用到数据库,而数据库的操作往往是涉及到磁盘 I/O 的读写。大量的数据库读写操作,会导致磁盘 I/O 性能瓶颈,进而导致数据库操作的延迟性。对于有大量数据库读写操作的系统来说,数据库的性能优化是整个系统的核心。

(8)锁竞争

在并发编程中,我们经常会需要多个线程,共享读写操作同一个资源,这个时候为了保持数据的原子性(即保证这个共享资源在一个线程写的时候,不被另一个线程修改),我们就会用到锁。锁的使用可能会带来上下文切换,从而给系统带来性能开销。JDK1.6 之后,Java 为了降低锁竞争带来的上下文切换,对 JVM 内部锁已经做了多次优化,例如,新增了偏向锁、自旋锁、轻量级锁、锁粗化、锁消除等。而如何合理地使用锁资源,优化锁资源,就需要你了解更多的操作系统知识、Java 多线程编程基础,积累项目经验,并结合实际场景去处理相关问题。
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值