目录

一、JAVA系统性能优化

Java线程池(java.util.concurrent.ThreadPoolExecutor)

连接池(org.apache.commons.dbcp.BasicDataSource)

JVM参数

linux内核优化

程序代码


一、JAVA系统性能优化

在CPU负载不足的同时,偶尔会有用户反映请求的时间过长,我们意识到必须对程序及JVM进行调优。从以下几个方面进行:

  • 线程池:解决用户响应时间长的问题
  • 连接池
  • JVM启动参数:调整各代的内存比例和垃圾回收算法,提高吞吐量
  • 代码优化
  • LINUX内核

Java线程池(java.util.concurrent.ThreadPoolExecutor)

大多数JVM6上的应用采用的线程池都是JDK自带的线程池,之所以把成熟的Java线程池进行罗嗦说明,是因为该线程池的行为与我们想象的有点出入。Java线程池有几个重要的配置参数:

  • corePoolSize:核心线程数(最新线程数)
  • maximumPoolSize:最大线程数,超过这个数量的任务会被拒绝,用户可以通过RejectedExecutionHandler接口自定义处理方式
  • keepAliveTime:线程保持活动的时间
  • workQueue:工作队列,存放执行的任务

Java线程池需要传入一个Queue参数(workQueue)用来存放执行的任务,需要使用有界队列ArrayBlockingQueue因此需要控制队列的大小来控制吞吐量及整体事件的处理时长;

参考caffeuine说明:https://zhouxinghang.github.io/caffeine.html

连接池(org.apache.commons.dbcp.BasicDataSource)

在使用org.apache.commons.dbcp.BasicDataSource的时候,因为之前采用了默认配置,所以当访问量大时,通过JMX观察到很多Tomcat线程都阻塞在BasicDataSource使用的Apache ObjectPool的锁上,直接原因当时是因为BasicDataSource连接池的最大连接数设置的太小,默认的BasicDataSource配置,仅使用8个最大连接。

我还观察到一个问题,当较长的时间不访问系统,比如2天,DB上的Mysql会断掉所以的连接,导致连接池中缓存的连接不能用。为了解决这些问题,我们充分研究了BasicDataSource,发现了一些优化的点:

  • Mysql默认支持100个链接,所以每个连接池的配置要根据集群中的机器数进行,如有2台服务器,可每个设置为60
  • initialSize:参数是一直打开的连接数
  • minEvictableIdleTimeMillis:该参数设置每个连接的空闲时间,超过这个时间连接将被关闭
  • timeBetweenEvictionRunsMillis:后台线程的运行周期,用来检测过期连接
  • maxActive:最大能分配的连接数
  • maxIdle:最大空闲数,当连接使用完毕后发现连接数大于maxIdle,连接将被直接关闭。只有initialSize < x < maxIdle的连接将被定期检测是否超期。这个参数主要用来在峰值访问时提高吞吐量。

initialSize是如何保持的?经过研究代码发现,BasicDataSource会关闭所有超期的连接,然后再打开initialSize数量的连接,这个特性与minEvictableIdleTimeMillis、timeBetweenEvictionRunsMillis一起保证了所有超期的initialSize连接都会被重新连接,从而避免了Mysql长时间无动作会断掉连接的问题。

JVM参数

在JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到一些目标:

  • GC的时间足够的小
  • GC的次数足够的少
  • 发生Full GC的周期足够的长

前两个目前是相悖的,要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一个更大的堆,我们只能取其平衡。

(1)针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值

(2)年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代,比如年轻代,通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小

(3)年轻代和年老代设置多大才算合理?这个我问题毫无疑问是没有答案的,否则也就不会有调优。我们观察一下二者大小变化有哪些影响

  • 更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增加每次GC的时间;小的年老代会导致更频繁的Full GC
  • 更小的年轻代必然导致更大年老代,小的年轻代会导致普通GC很频繁,但每次的GC时间会更短;大的年老代会减少Full GC的频率

(4)在配置较好的机器上(比如多核、大内存),可以为年老代选择并行收集算法: -XX:+UseParallelOldGC ,默认为Serial收集

(5)线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,

linux内核优化

单集成的最大句柄数 :fs.file max = 999999

TCP发送keepalive消息的频率: net.ipv4.tcp_keepalive_time = 600 调下可以加快清除无效链接

程序代码

1、尽量在合适的场合使用单例

2、尽量避免随意使用静态变量:GC通常是不会回收这个静态变量所占有的内存

3、尽量避免过多过常地创建Java对象

4、尽量使用局部变量:临时变量都保存在栈(Stack)中,速度较快;其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。

5、慎用synchronized,尽量减小synchronize的方法

6、尽量使用基本数据类型代替对象

7、多线程在未发生线程安全前提下应尽量使用HashMap、ArrayList

8、尽量减少对变量的重复计算

9、尽量使用移位来代替’a/b’ ‘a*b’的操作

10、尽量确定StringBuffer的容量: 默认16的字符大小,超出会重新分配迁移,浪费性能;

11、尽量早释放无用对象的引用

12、尽量避免使用二维数组

13、注意循环中简化代码操作

JAVA系统性能优化相关推荐

  1. 主题 07:如何进行 Java 系统性能优化(下)

    1. 引言 系统性能优化涉及面非常广,涵盖方案优化.编码优化.并发优化.JVM 调优等诸多方面的知识. 虽然不同系统的优化策略存在差异,但从全局来看,它们的共性仍是主要的.首先,我们可以从方案设计.编 ...

  2. 面试进阶齐飞!Github一天万赞的阿里Java系统性能优化有多牛?

    前两天在知乎上看到一个问答,说的是: 一个Java程序员具备什么样的素质和能力才可以称得上高级工程师? 这个问题也引发了我的一些思考,可能很多人会说,"作为高级工程师,基础得过硬.得熟练掌握 ...

  3. java strim性能_你所不知道的Java性能优化之String!

    Java性能优化之String字符串优化 1.字符串对象及其特点 Java中八大基本数据类型没有String类型,因为String类型是Java对char数组的进一步封装. String类的实现主要由 ...

  4. java性能优化权威指南_Java性能优化权威指南 PDF扫描[132MB]

    Java性能优化权威指南主要为Java SE 和Java EE 应用的性能调优提供建议.主要包括以下几方面:性能监控.性能分析.Java HotSpot VM 调优.高效的基准测试以及Java EE ...

  5. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  6. 《java系统性能调优》--1.发现瓶颈

    性能啊!性能! 之所以想写写性能调优,也是有感于我们的项目,我们採用一些手段使得系统性能上升了一个台阶,总是须要把这点经验沉淀一下.随着工作的深入,关于系统性能的事肯定还有非常多,也算是通过这个系列文 ...

  7. 系统性能优化策略 -- 持续优化更新

    [开篇词]      无论是传统行业还是互联网行业,一个优秀的软件产品,必须兼顾产品的质量和性能.这二者也可以反映出从业者的技术能力.思维方式以及格局!故性能优化应该是我们所有猿类共同的追求. [策略 ...

  8. Java性能优化权威指南--笔记

    出处:http://xiongpq.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 原文 ...

  9. Java性能优化指南(一)

    2015年在大物流项目中,给项目团队做了几次Java性能优化和问题排查的分享,不过效果都不是很好.一直觉得偏向技术实践类的东西,单纯的听和单纯的讲收获都很有限,最好的做法是阅读学习-理解-实践-总结, ...

  10. Java 程序优化 (读书笔记)

    --From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版) 1. java性能调优概述 1.1 性能概述 程序性能: 执行速度,内存分配,启动时间, 负载承受能力. 性能 ...

最新文章

  1. redis主从复制搭建
  2. java怎么运行class文件,面试必会
  3. F# 4.0于全平台发布
  4. Fedora20下安装编译环境
  5. 如虎添翼|高德地图+Serverless 护航你的假日出行
  6. django连接数据库和数据迁移
  7. android webview 获取网页内容,在WebView中获取网页中的内容
  8. java超长字符序列化_String 字符串最长可以有多长?
  9. 基于金融知识图谱的会计欺诈风险识别方法
  10. 力扣题目——1557. 可以到达所有点的最少点数目
  11. Android onSaveInstanceState onRestoreInstanceState
  12. VC2013/MFC,异常: 0xC0000005
  13. CCS7.3 安装使用教程
  14. 下载Chrome浏览器历史版本方法
  15. 关闭Vue Eslint语法检查
  16. 入门到放弃之 NVMe-MI --- 协议简介
  17. 夜天之书 #26 Four-Factor OSC
  18. 异地远程群晖NAS教程【cpolar内网穿透】
  19. BZOJ 2277 Poi2011 Strongbox
  20. SQL转换日期格式dd-mm-yyyy为yyyy-mm-dd

热门文章

  1. 树莓派SSH脚本自动将攻击IP加入黑名单
  2. linux+mmap父子通信_Linux 系统开发5 进程间通信 pipe() fifo() mmap()
  3. MFC基于 单文档为状态栏添加进度条
  4. linux 内核模块 定时器,linux内核定时器__backup_timer_hour_struct_定时器_模块__169IT.COM...
  5. java的百度编辑器插件下载安装_ueditor-extend
  6. matlab语言与应用 10 数学问题的非传统解法
  7. windows 平台 atom编辑器常用快捷键
  8. 离散数学:等价关系与集合覆盖
  9. SQL Server Storage
  10. 硬件文章远程视频监控