JAVA系统性能优化
目录
一、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系统性能优化相关推荐
- 主题 07:如何进行 Java 系统性能优化(下)
1. 引言 系统性能优化涉及面非常广,涵盖方案优化.编码优化.并发优化.JVM 调优等诸多方面的知识. 虽然不同系统的优化策略存在差异,但从全局来看,它们的共性仍是主要的.首先,我们可以从方案设计.编 ...
- 面试进阶齐飞!Github一天万赞的阿里Java系统性能优化有多牛?
前两天在知乎上看到一个问答,说的是: 一个Java程序员具备什么样的素质和能力才可以称得上高级工程师? 这个问题也引发了我的一些思考,可能很多人会说,"作为高级工程师,基础得过硬.得熟练掌握 ...
- java strim性能_你所不知道的Java性能优化之String!
Java性能优化之String字符串优化 1.字符串对象及其特点 Java中八大基本数据类型没有String类型,因为String类型是Java对char数组的进一步封装. String类的实现主要由 ...
- java性能优化权威指南_Java性能优化权威指南 PDF扫描[132MB]
Java性能优化权威指南主要为Java SE 和Java EE 应用的性能调优提供建议.主要包括以下几方面:性能监控.性能分析.Java HotSpot VM 调优.高效的基准测试以及Java EE ...
- 推荐:Java性能优化系列集锦
Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...
- 《java系统性能调优》--1.发现瓶颈
性能啊!性能! 之所以想写写性能调优,也是有感于我们的项目,我们採用一些手段使得系统性能上升了一个台阶,总是须要把这点经验沉淀一下.随着工作的深入,关于系统性能的事肯定还有非常多,也算是通过这个系列文 ...
- 系统性能优化策略 -- 持续优化更新
[开篇词] 无论是传统行业还是互联网行业,一个优秀的软件产品,必须兼顾产品的质量和性能.这二者也可以反映出从业者的技术能力.思维方式以及格局!故性能优化应该是我们所有猿类共同的追求. [策略 ...
- Java性能优化权威指南--笔记
出处:http://xiongpq.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 原文 ...
- Java性能优化指南(一)
2015年在大物流项目中,给项目团队做了几次Java性能优化和问题排查的分享,不过效果都不是很好.一直觉得偏向技术实践类的东西,单纯的听和单纯的讲收获都很有限,最好的做法是阅读学习-理解-实践-总结, ...
- Java 程序优化 (读书笔记)
--From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版) 1. java性能调优概述 1.1 性能概述 程序性能: 执行速度,内存分配,启动时间, 负载承受能力. 性能 ...
最新文章
- redis主从复制搭建
- java怎么运行class文件,面试必会
- F# 4.0于全平台发布
- Fedora20下安装编译环境
- 如虎添翼|高德地图+Serverless 护航你的假日出行
- django连接数据库和数据迁移
- android webview 获取网页内容,在WebView中获取网页中的内容
- java超长字符序列化_String 字符串最长可以有多长?
- 基于金融知识图谱的会计欺诈风险识别方法
- 力扣题目——1557. 可以到达所有点的最少点数目
- Android onSaveInstanceState onRestoreInstanceState
- VC2013/MFC,异常: 0xC0000005
- CCS7.3 安装使用教程
- 下载Chrome浏览器历史版本方法
- 关闭Vue Eslint语法检查
- 入门到放弃之 NVMe-MI --- 协议简介
- 夜天之书 #26 Four-Factor OSC
- 异地远程群晖NAS教程【cpolar内网穿透】
- BZOJ 2277 Poi2011 Strongbox
- SQL转换日期格式dd-mm-yyyy为yyyy-mm-dd
热门文章
- 树莓派SSH脚本自动将攻击IP加入黑名单
- linux+mmap父子通信_Linux 系统开发5 进程间通信 pipe() fifo() mmap()
- MFC基于 单文档为状态栏添加进度条
- linux 内核模块 定时器,linux内核定时器__backup_timer_hour_struct_定时器_模块__169IT.COM...
- java的百度编辑器插件下载安装_ueditor-extend
- matlab语言与应用 10 数学问题的非传统解法
- windows 平台 atom编辑器常用快捷键
- 离散数学:等价关系与集合覆盖
- SQL Server Storage
- 硬件文章远程视频监控