打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
文件IO消耗严重的问题
分布式java应用中文件IO消耗的原因有:
多个线程同时写入同一个文件,例如日志系统,随着文件的变大 ,写入的速度逐渐降低,造成各线程对写锁的竞争。
解决的方法有:
1、文件异步写---当进行写操作时,当发起写的操作后,不必等待写操作结束后就可以直接返回。当写操作完成时会通知应用程序来进行相应的处理。
2、批量写入
3、限流---将文件IO消耗控制到一个可以接受的范围,当达到上限时,需要采取一些措施。例如将IO请求存放到一个无限队列中或停止一段时间的写入。
4、控制写入文件的大小,超出文件限制时可以生成一个新的文件。
网络IO消耗分析
对于分布式Java应用,网卡中断是不是均衡分配到各CPU(cat/proc/interrupts查看)。


网络IO消耗严重的解决方法

从程序的角度而言,造成网络IO消耗严重的原因主要是同时需要发送或接收的包太多。

常用调优方法:

限流,限流通常是限制发送packet的频率,从而在网络IO消耗可接受的情况下来发送packget。

三、内存


释放不必要的引用:代码持有了不需要的对象引用,造成这些对象无法被GC,从而占据了JVM堆内存。(使用ThreadLocal:注意在线程内动作执行完毕时,需执行ThreadLocal.set把对象清除,避免持有不必要的对象引用)

使用对象缓存池:创建对象要消耗一定的CPU以及内存,使用对象缓存池一定程度上可降低JVM堆内存的使用。

采用合理的缓存失效算法:如果放入太多对象在缓存池中,反而会造成内存的严重消耗, 同时由于缓存池一直对这些对象持有引用,从而造成Full GC增多,对于这种状况要合理控制缓存池的大小,避免缓存池的对象数量无限上涨。(经典的缓存失效算法来清除缓存池中的对象:FIFO、LRU、LFU等)

合理使用SoftReference和WeekReference:SoftReference的对象会在内存不够用的时候回收,WeekReference的对象会在Full GC的时候回收


充分利用硬件资源(CPU和内存):
充分利用CPU
在能并行处理的场景中未使用足够的线程(线程增加:CPU资源消耗可接受且不会带来激烈竞争锁的场景下),例如单线程的计算,可以拆分为多个线程分别计算,最后将结果合并,JDK 7中的fork-join框架。
Amdahl定律公式:1/(F+(1-F)/N)。
充分利用内存
数据的缓存、耗时资源的缓存(数据库连接创建、网络连接的创建等)、页面片段的缓存。
毕竟内存的读取肯定远快于硬盘、网络的读取,在内存消耗可接受、GC频率、以及系统结构(例如集群环境可能会带来缓存的同步)可接受情况下,应充分利用内存来缓存数据,提升系统的性能。
总结:
好的调优策略是收益比(调优后提升的效果/调优改动所需付出的代价)最高的,通常来说简单的系统调优比较好做,因此尽量保持单机上应用的纯粹性,这是大型系统的基本架构原则。
调优的三大有效原则:充分而不过分使用硬件资源、合理调整JVM、合理使用JDK包。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
性能优化:关于缓存的一些思考
58DSP性能优化实践分享
四种缓存的避坑总结
单核CPU, 1G内存,也能做JVM调优吗?
Project Tungsten:让Spark将硬件性能压榨
多核平台下的JAVA优化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服