Java性能调优实践
1 导论
JVM主要有两类调优标志:布尔标志和附带参数标志
布尔标志:-XX:+FlagName表示开启,-XX:-FlagName表示关闭。
附带参数标志:-XX:FlagName=something,表示将标志FlagName的值设置为something。
2 性能测试方法
性能测试4项原则:
2.1 原则1:测试真实应用
2.2 原则2:理解处理时间、吞吐量和响应时间
2.3 原则3:用统计方法应对性能的变化
2.4 原则4:尽早频繁测试
3 性能调优工具
3.1 Java监控工具
jcmd,jconsole,jhat,jmap,jinfo,jstack,jstat,jvisualvm
3.2 性能分析工具
采用分析器,探查分析器,本地分析器
3.3 性能关注指标
CPU使用率,内存使用率,磁盘使用率,网络使用率
4 JIT编译器
即时(Just-In-Time, JIT)编译器是Java虚拟机的核心。对JVM性能影响最大的莫过于编译器的,而选择编译器是运行Java程序首先有做的。
4.1 选择编译器类型
Client(-client)、Server(-server)或二者同用
4.2 JIT编译器版本
JIT编译器版本有3中:
32位client编译器
32位server编译器
64位server编译器
如果是32位操作系统,则必须使用32位的JVM。如果是64位操作系统,则既可以选择32位的JVM,也可以选择64位JVM。
4.3 编译细节
不用担心小方法,如getter和setter,因为他们很容易内联。
需要编译的代码在编译队列中。
代码缓存是有限的资源。
代码越简单,优化越多。
5 垃圾收集
5.1 概述
垃圾收集由两步构成:查找不再使用的对象,以及释放这些对象所管理的内存。
分代垃圾收集器,老年代,新生代。
GC算法,Serial垃圾收集器,Throughput垃圾收集器,CMS收集器,G1垃圾收集器。
5.2 GC调优基础
调整堆的大小,初始堆Xms,最大堆Xmx。
代空间的调整,新生代和老年代的空间占用比率,初始大小。
控制并发。
自适应调整
6 堆内存最佳实践
6.1 堆分析
浅对象大小、保留对象大小及深对象大小。
一个对象的浅大小,指的是该对象本身的大小。如果柜对象包含一个指向另一个对象的引用,4字节或8字节的引用会计算在内,但是目标对象的大小不会包含进来。深大小则包含那些对象的大小。深大小和保留大小的区别在于那些存在共享的对象。
内存溢出错误(OutofMemoryError, OOM)一般在以下集中情形会抛出:
JVM没有原生内存可用。
元空间(或永久代)内存不足。
JVM堆本身内存不足。
JVM执行GC耗时太多。
6.2 减少内存使用
减少对象大小、对象的延迟初始化、使用规范化对象、对象池化、弱引用、软引用
7 线程与同步的性能
7.1 线程池与ThreadPoolExecutor
调节线程池的大小对获得最好的性能至关重要,包括最小线程数和最大线程数。
线程池工作方式:有一个或多个队列,任务被提交到这个(些)队列中,一定数量的线程会从这个(些)队列中取任务,然后执行。
7.2 线程同步
同步对性能有两个方面的影响:
1) 应用在同步块上所花的时间会影响到该应用的可伸缩性;
2) 获取同步锁需要一些CPU周期,所以也会影响性能。
如何避免同步:
1) 在每个线程中使用不同的对象;
2) 基于CAS的替代方案(volatile,原子类型)。
7.3 线程调优
1) 调节线程栈大小-Xss;
2) 自旋锁;
3) 调整线程优先级;
8 数据库性能最佳实践
8.1 预处理语句与语句池
大多数情况下,进行JDBC调用时,推荐使用PreparedStatement,尽量避免直接使用Statement。预处理语句让数据库有机会重用已经执行过的SQL信息,节省之后运行的预处理语句的开销,提升执行效率。但是,首次使用预处理语句时,数据库会耗费更多的执行时间,因为它需要设置和保存相应的信息。如果这个语句仅使用一次,这些额外的工作就被浪费了,这种情况下,使用常规的语句(Statement)可能是更好的选择。
8.2 JDBC连接池
创建数据库连接是非常耗时的操作,所有的JDBC连接都应源自连接池。
8.3 结果集的处理
通过PreparedStatement对象的setFetchSize()方法可以控制JDBC驱动程序一次返回多少行数据。
Java性能调优实践的更多相关文章
- [转载]Java 应用性能调优实践
Java 应用性能调优实践 Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具 ...
- Java性能调优笔记
Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...
- JVM性能调优实践——JVM篇
前言 在遇到实际性能问题时,除了关注系统性能指标.还要结合应用程序的系统的日志.堆栈信息.GClog.threaddump等数据进行问题分析和定位.关于性能指标分析可以参考前一篇JVM性能调优实践-- ...
- Java性能调优攻略全分享,5步搞定!(附超全技能图谱)
对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...
- Java性能调优(一):调优的流程和程序性能分析
https://blog.csdn.net/Oeljeklaus/article/details/80656732 Java性能调优 随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我 ...
- Java性能调优:利用JMC分析性能
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...
- Java性能调优:利用JFR生成性能日志
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...
- 第六章 Java性能调优工具(待续)
Java性能调优工具 Windows工具 JDK命令行工具 JConsole工具 Visual VM多合一工具 Visual VM对QQL的支持 MAT内存分析工具 MAT对QQL的支持 JProfi ...
- java 性能调优和GC
JAVA 性能调优和GC http://blog.csdn.net/gzh0222/article/details/7663181 JAVA GC调优手记 http://blog.csdn.net/f ...
随机推荐
- COCO2018 stuff分割
stuff何许人也,相对于目标而言的环境信息,一般是图像中的草地,墙面或者天空,因为往往在一张图像中这些背景占据着大部分像素,对于场景理解必不可少,所以引入了这一任务. 不过目前这个任务还没有发布te ...
- redux超易学三篇之三(一个逻辑完整的react-redux)
配合源代码学习吧~ : 我是源代码 这一分支讲的是 如何完整地(不包含优化,也没有好看的页面) 搭建一个 增删改查 的 react-redux 系统 不同于上一节的 react-redux,这里主要采 ...
- EasyUI学习笔记(一)EasyUI入门
一.EasyUI下载 EasyUI官方下载地址:http://www.jeasyui.com/download/index.php,目前最新的版本是:jquery-easyui-1.7.2 解压后得到 ...
- C++_类入门1-对象和类的介绍
面向对象是(OOP)是特殊的.设计程序的概念性方法:包含以下特性: 抽象: 封装和数据隐藏: 多态: 继承: 代码的可重用性: 为了实现这些特性并且将这些特性组合在一起,C++所做的最重要的改进是提供 ...
- ui-grid样式,表格高度自适应行高,没有滚动条,去掉表头
前后端设置:
- 剪邮票--蓝桥杯--dfs--思路超清晰
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...
- hdu1022 模拟栈
Train Problem I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- PIE SDK地图放大镜
放大镜,在地图的浏览过程中在主地图和次地图中起到很好的辅助作用, 要实现放大镜功能主要就是通过两个mapControl控件,主地图控件是mapControlMain,放大镜控件是UserControl ...
- linux无敌权限之chattr
chattr 修改文件或者目录的文件属性,添加超级权限 -R 递归修改文件机子目录 -V 显示详细修改的内容 + 在原有的基础上追加参数 — 减参数 = 跟新为指定参数 a append 设定改参数后 ...
- Python 字符串 (str)
作者博文地址:https://www.cnblogs.com/liu-shuai/ Python字符串的常用操作包括以下但不限于以下操作: 1 字符串的替换.删除.切片.复制.连接.比较.查找.分割等 ...