论性能优化措施(JAVA)

本文全面解析了从前端到后端的性能优化策略,包括减少HTTP请求、使用CDN、压缩文件、多线程编程、数据库查询优化、结果缓存、GC优化及硬件升级等关键方法,旨在帮助开发者提升应用性能。

一 前端性能优化

1.页面的HTTP请求数量

2.使用CDN网络

3.是否使用压缩,对于前段样式文件与脚本文件,可将其中空格、注释等不必要的字符去掉,并且通过使用gzip压缩来减少网络上传输的字节数。

二 java程序优化

1.使用单例,如饿汉

2.future编程

3.线程池。明明是多核CPU,但程序中却是用单线程串行操作,这种情况下可以将原来的串行操作改成多线程并发,以提高执行效率。

4.选择就绪。也就是使用NIO编程,代替阻塞IO能提高程序的并发吞吐能力,降低系统的开销。

5.减少上下文切换。程序在进行锁等待或者被阻塞时,当前线程会挂起。因此,如果锁的竞争激烈,或者线程频繁IO阻塞,就可能导致上下文切换过于频繁,从而增加调度开销,并且降低程序的吞吐量。

6.降低锁竞争。具体的就是synchronized锁从方法级降低,可以在具体方法内需要进行代码块同步的地方再加synchronized。

三 压缩

在进行数据传输之前,可以将数据进行压缩,以减少网络传输的字节数,提升数据传输的速度,

四 结果缓存

对于相同的用户请求,如果每次都重复地查询数据库,重复地进行计算,将浪费很多的时间和资源。将计算后的结果缓存到本地内存,或者是通过分布式缓存来进行结果的缓存,可以节约宝贵的CPU资源,减少重复的数据库查询或者磁盘IO,将原本磁头的物理转动变成内存的电子运动,提高应用的响应速度,并且线程的迅速释放也使得应用的吞吐能力得到了提升。

五 数据库的查询性能优化

1.合理使用索引。

2.反范式设计。将一些常用的需要关联查询的列进行冗余存储,以便减少表关联带来的随机IO和全表扫描。

3.使用查询缓存。通过修改配置文件来配置缓存的大小和阈值。

4.使用搜索引擎。

5.使用key-value数据库。将数据进行扁平化存储。

六 GC优化

通过GC日志能够看出一些端倪,包括minor gc的频率,full gc的频率,gc导致的停顿时间以及gc发生的原因等。可以通过这些信息来解决GC所导致的一些问题,已经对应用性能进行优化。

一般看日志就可以进行一些参数调节,比如方法区太小那就调方法区默认大小,如果想注重GC吞吐量或者是暂停时间,可以选用相应的垃圾收集器组合。

七 硬件提升性能

分布式缓存集群来说,希望内存越大越好。

磁盘IO选用SSD硬盘。

采用nginx软件负载均衡策略的网络节点来说,那网卡的吞吐能力就是性能的瓶颈。

多线程并发的时候更注重CPU的多核,越多越好。

 

https://www.liangzl.com/get-article-detail-16566.html

GC 日志解读

https://blog.youkuaiyun.com/renfufei/article/details/49230943

调优实战

https://blog.youkuaiyun.com/renfufei/article/details/61924893

https://blog.youkuaiyun.com/u012257955/article/details/75050893full

full GC 实战分析

https://blog.youkuaiyun.com/zawdd/article/details/50888430

https://blog.youkuaiyun.com/u012257955/article/details/75050893

https://blog.youkuaiyun.com/huaweitman/article/details/50899839

Java 性能优化措施可以从多个方面入手,以下是一些常见的措施: ### JVM 使用 JVM 相关命令工具(如 jps、jstat、jinfo、jmap、jhat、jstack、jcmd、jstatd 等)查看 JVM 状态和性能指标,进而对 JVM 参数进行整。例如根据 `jstat` 计算出的年轻代对象增长速率等数据,设置堆内存大小、年轻代大小、Eden 和 Survivor 的比例、老年代的大小、大对象的阈值、大龄对象进入老年代的阈值等参数。还可以使用 `jinfo` 实时查看和修改 JVM 配置参数,如 `jinfo -flag MaxHeapSize=2g 10217` 尝试将最大堆内存大小设置为 2GB 等 [^3][^4][^5]。 ### 代码化 - **字符串处理**:放弃字符串拼接,使用 `StringBuilder` 来提高字符串拼接的性能。因为使用 `+` 进行字符串拼接时,会创建大量的临时 `String` 对象,而 `StringBuilder` 是可变的字符序列,避免了频繁创建对象带来的开销 [^1]。 ```java // 不推荐的字符串拼接方式 String result = ""; for (int i = 0; i < 10; i++) { result = result + i; } // 推荐使用 StringBuilder StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.append(i); } String result2 = sb.toString(); ``` ### 缓存使用 根据不同的需求选择合适的缓存方式。如果数据量小,并且不会频繁地增长又清空(避免导致频繁地垃圾回收),可以选择本地缓存。如果需要策略支持(比如缓存满的逐出策略)考虑使用 `Ehcache`,如果不需要,可以考虑 `HashMap`,如果需要考虑多线程并发,使用 `ConcurrentHashMap` [^3]。 ```java import java.util.concurrent.ConcurrentHashMap; // 使用 ConcurrentHashMap 作为缓存 ConcurrentHashMap<String, Object> cache = new ConcurrentHashMap<>(); cache.put("key", "value"); Object value = cache.get("key"); ``` ### 数据库 化数据库查询语句,创建合适的索引,避免全表扫描。合理设计数据库表结构,减少数据冗余和不必要的关联查询。 ### 接口性能优化 化接口的响应时间,减少接口用的次数。可以采用异步处理、批量处理等方式提高接口的吞吐量。 ### 服务器 对于 Java Web 应用,可对服务器(如 Tomcat)进行,合理配置服务器的线程池大小、连接数等参数,提高服务器的并发处理能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值