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性能调优实践的更多相关文章

  1. [转载]Java 应用性能调优实践

    Java 应用性能调优实践 Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具 ...

  2. Java性能调优笔记

    Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...

  3. JVM性能调优实践——JVM篇

    前言 在遇到实际性能问题时,除了关注系统性能指标.还要结合应用程序的系统的日志.堆栈信息.GClog.threaddump等数据进行问题分析和定位.关于性能指标分析可以参考前一篇JVM性能调优实践-- ...

  4. Java性能调优攻略全分享,5步搞定!(附超全技能图谱)

    对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...

  5. Java性能调优(一):调优的流程和程序性能分析

     https://blog.csdn.net/Oeljeklaus/article/details/80656732 Java性能调优 随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我 ...

  6. Java性能调优:利用JMC分析性能

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...

  7. Java性能调优:利用JFR生成性能日志

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...

  8. 第六章 Java性能调优工具(待续)

    Java性能调优工具 Windows工具 JDK命令行工具 JConsole工具 Visual VM多合一工具 Visual VM对QQL的支持 MAT内存分析工具 MAT对QQL的支持 JProfi ...

  9. java 性能调优和GC

    JAVA 性能调优和GC http://blog.csdn.net/gzh0222/article/details/7663181 JAVA GC调优手记 http://blog.csdn.net/f ...

随机推荐

  1. 关于NPOIExcel导出excel

    1.支持导出多个sheet文件 /// <summary> /// 导出到Excel并下载(html) /// </summary> /// <param name=&q ...

  2. python之函数(二)

    上一篇中我们在函数体中的写的都是打印语句,用print来输出打印结果.但是在实际使用的时候,我们并不需要将结果输出在控制台上.这时候该如何解决呢? 1. return返回值. 我们可以将函数的结果通过 ...

  3. 如何写javascript代码隐藏和显示这个div

    如何写javascript代码隐藏和显示这个div 浏览次数:82次悬赏分:10 | 解决时间:2011-4-21 14:41 | 提问者:hade_girl <div id="div ...

  4. 上海高校程序设计竞赛 D CSL 的字符串 ( 贪心)

    题目描述 CSL 以前不会字符串算法,经过一年的训练,他还是不会……于是他打算向你求助. 给定一个字符串,只含有可打印字符,通过删除若干字符得到新字符串,新字符串必须满足两个条件: 原字符串中出现的字 ...

  5. HDU 6189 Law of Commutation(规律)

    题意: 给定n,a,求区间 [ 1 , 1<<n ] 的数b 满足 的个数 分析:打出暴力程序可以发现当a为奇数的时候结果为一: 当a为偶时 , a^b=2^(k+b)mod 2^n ; ...

  6. AngularJS 中ng-model通过$watch动态取值

    这个例子的意思是,当xxxx的长度不超过6时,xxxx和yyyy两个input的model是无关的,但当xxxx超过6,则yyyy会跟随其值而变化. 另一种做法是在input的ng-model后面添加 ...

  7. harbor 仓库搭建

    一,介绍 Harbor是一个用于存储Docker镜像的企业级Registry服务. Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry ...

  8. java多态简单例子

    /* 对象的多态性:动物 x = new 猫(); 函数的多态性:函数重载.重写 1.多态的体现 父类的引用指向了自己的子类对象 父类的引用也可以接收自己的对象 2.多态的前提 必须是类与类之间只有关 ...

  9. hibernateAPI详解

    1 Configuration package www.test.b_api; import org.hibernate.Session; import org.hibernate.SessionFa ...

  10. 解决引入外部文件(图片、js等)出现 403 net::ERR_ABORTED 的问题

    页面中引入外网的链接资源,会产生一个新的http请求.为了安全(URL里可能包含用户信息),浏览器一般都会给这写请求头加上表示来源的referrer 字段. 所以,此时我们需要隐藏外部链接中的refe ...