zoukankan      html  css  js  c++  java
  • 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驱动程序一次返回多少行数据。

  • 相关阅读:
    高效程序猿的45个习惯:敏捷开发修炼之道之主题建议翻译1-10
    VS2010旗舰版安装图解
    ibatis 使用 in 查询的几种XML写法
    人脸识别算法初次了解
    键盘过滤驱动
    python property属性
    癞子麻将胡牌算法实现
    恩布900手机客服,安卓版本号Entboost Android 1.0 正式公布
    C语言递归实现二叉树的先序、中序、后序遍历
    CSS:CSS 属性 选择器
  • 原文地址:https://www.cnblogs.com/aurain/p/6741185.html
Copyright © 2011-2022 走看看