很不错的书籍。值得反复阅读。附带下载地址。

第一章 java性能调优概述

一般来说,程序的性能的表现方面:

  • 执行速度
  • 内存分配
  • 启动时间
  • 负载承受能力

性能参考指标:

  • 执行时间
  • CPU时间
  • 内存分配
  • 磁盘吞吐量
  • 网络吞吐量
  • 响应时间

木桶原理与性能瓶颈,最有可能成为性能瓶颈的环节:

  • 磁盘IO
  • 网络操作
  • CPU
  • 异常
  • 数据库
  • 锁竞争
  • 内存
    加速比=优化前系统耗时/优化后系统耗时
    Amdahl定律:
    加速比speedup<=1/(F+(1-F)/N)
    其中N为CPU处理器数量,F为系统内必须串行化的程序比重。由此可见,为了提高系统的运行速度,仅仅增加N,是不能提高运行速度的,从根本上修改程序的串行化行为,提高系统内并行模块的占比,才行。

性能调优层次:

  1. 设计调优
  2. 代码调优
  3. JVM调优
  4. 数据库调优:1. 应用层SQL优化;2.数据库优化;3.数据库软件优化;
  5. 操作系统调优:共享内存段、信号量、共享内存最大值shmmax、共享内存最小值shmmin、最大文件句柄数、虚拟内存大小、磁盘块大小。

第二章 设计优化

常用手段

  1. 善用设计模式

    1. 单例模式
    2. 代理模式
    3. 享元模式
    4. 装饰者模式
    5. 观察者模式
    6. value object模式
    7. 业务代理模式
  2. 常用的优化组件和方法
    1. 缓冲buffer,缓冲区是一块特定的内存区域;缓冲区不宜过大,浪费系统内存,增加GC负担;
    2. 缓存cache,WeakHashMap;EHCache数据缓存解决方案,OSCache,可用于缓存任何对象,JBossCache可用于JBoss集群间数据共享的缓存框架;EHCache的缺点是缓存组件和业务层代码紧密耦合,依赖性太强;基于动态代理的缓存;
    3. 对象复用-池:线程池,数据库连接池;适用场景:创建耗时的大对象,节省获取对象实例的成本,减少GC负担;生成实例成本小的对象,使用池的方式,得不偿失;JDK new操作的效率很高,但是new操作所调用的类的构造函数可能很耗时;apache commons-pool对象池组件,对象池接口ObjectPool,PoolableObjectFactory,内置三个对象池,StackObjectPool,GenericObjectPool,SoftReferenceObjectPool;
    4. 并行代替串行
    5. 负载均衡,Apache+Tomcat集群搭建负载均衡解决方案,Session共享模式,黏性Session模式和复制Session模式;跨JVM分布式缓存框架Terracotta,可以实现Tomcat的Session共享;
    6. 时间换空间,看系统的性能瓶颈是什么,空间是瓶颈,则采用时间换空间;
    7. 空间换时间

第三章 java程序优化

  1. 字符串优化处理
  2. 核心数据结构
  3. 使用NIO
  4. 引用类型
    1. 强引用
    2. 软引用
    3. 弱引用
    4. 虚引用
  5. 其他技巧
    1. 异常try…catch,慎用,循环中不能用;
    2. 使用局部变量;
    3. 位运算代替乘除法;
    4. 少用switch,尤其是分支多的情况;
    5. 一位数组代替二维数组,减少集合的方法调用;
    6. 提取表达式(重复的部分),尤其是遇到循环;
    7. 展开循环;
    8. 布尔运算代替位运算(条件判断&&||,断路原则);
    9. arrayCopy();
    10. 使用buffer进行IO操作;
    11. 使用clone()代替new;
    12. 静态方法代替实例方法;

String对象的3个特点:

  • 不变性;
  • 针对常量池的优化:当两个String对象拥有相同的值时,他们只是引用常量池的同一个拷贝;
  • 类的final定义;
    字符串分割与查找

第四章 并行程序开发优化

  1. 并行程序设计模式

    1. Future模式,即异步;
    2. master-worker模式,类似于fork-join,master进程负责接收和分配任务,worker进程负责处理子任务;
    3. Guarded Suspension模式,
    4. 不变模式,不变模式比只读属性具有更强的一致性和不变性,只读属性自身可能变化;不变模式的使用条件:1. 对象创建后,其内部状态和数据不再发生变化;2. 对象需要被共享,被多线程频繁访问。实现4要点:1. 去掉setter方法和所有修改自身属性的方法;2. 所有属性私有且final;3. 没有子类可以继承并重写其方法;4. 构造函数可以创建完整对象。
    5. 生产者-消费者模式;
  2. JDK多任务执行框架
    1. 无限制线程的缺陷
    2. 简单的线程池实现
    3. Executor框架
    4. 自定义线程池
    5. 优化线程池大小,估算公式:N = Nc * Uc * (1+W/C),其中Nc是CPU的数量,Uc是CPU的使用率,W/C是等待时间与计算时间的比率。
    6. 扩展ThreadPoolExecutor
  3. JDK并发数据结构
    1. 并发List
    2. 并发Set
    3. 并发Map
    4. 并发Queue
    5. 并发Deque
  4. 并发控制方法
  5. 锁性能与优化
  6. 无锁并行计算
  7. 协程

第五章 JVM调优

JVM 内存模型

  1. 程序计数器
  2. java虚拟机栈
  3. 本地方法栈
  4. java堆
  5. 方法区

JVM内存分配参数

  • 最大堆内存
  • 最小堆内存
  • 新生代
  • 持久代
  • 线程栈
  • 堆的比例分配

垃圾收集
垃圾收集器要处理的基本问题:

  1. 哪些对象需要回收?
  2. 何时回收这些对象?
  3. 怎么回收这些对象?

算法:

  • 引用计数法(reference counting):问题:循环引用;
  • 标记-清除算法(mark-sweep),两个阶段,可达性分析;问题:空间碎片,尤其是大对象的内存分配,不连续的内存空间的工作效率要低于连续的空间。
  • 复制(copy),代价:内存折半;其高效性建立在存活对象少、垃圾对象多的情况。
  • 标记压缩(mark-compact),将所有的存活对象压缩到内存的另一侧;
  • 增量(incremental collecting),垃圾回收时,stw,所有线程挂起;故,垃圾回收与应用程序交替执行;但是线程切换和上下文转换的消耗,使得GC的成本提高,吞吐量下降。
  • 分代(generational collecting)

垃圾收集器的类型
按线程数分,串行GC和并行GC;
工作模式分,并发式和独占式;
碎片处理方式分,压缩和非压缩;
工作的内存区间分,新生代和老年代;

评价GC策略的指标:

  • 吞吐量
  • 垃圾回收器负载
  • 停顿时间
  • 垃圾回收频率
  • 反应时间
  • 堆分配

新生代串行收集器:单线程、独占式,stop the world,client模式下默认的GC,没有线程切换的开销;
老年代串行收集器:标记-压缩,单线程、独占式,CMS的备用GC;
并行收集器:多线程,独占式,有线程切换的开销,线程数通过-XX:ParallelGCThreads指定,CPU<8,设置为GC数,CPU>8,设置为3+[(5*CPU_count)/8]

第六章 性能调优工具

1. Linux命令行

1. top
2. sar
3. vmstat
4. iostat
5. pidstat

2. Windows工具

任务管理器

perfmon性能监控工具

process explorer

加强版的任务管理器

pslist

基本用法:
pslist [-d] [-m] [-x] [-t] [-s [n]] [-r n] [name | pid]

3. JDK命令行

1. jps
2. jstat
3. jmap
4. jstack
5. jinfo
6. jhat
7. jstatd
8. hprof

4. JConsole

5. Visual VM多合一工具

6. Visual VM对OQL的支持

7. MAT内存分析工具

8. MAT对OQL的支持

9. JProfile

《Java程序性能优化》读书笔记相关推荐

  1. 读书笔记 | 墨菲定律

    1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...

  2. 读书笔记 | 墨菲定律(一)

    1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...

  3. 洛克菲勒的38封信pdf下载_《洛克菲勒写给孩子的38封信》读书笔记

    <洛克菲勒写给孩子的38封信>读书笔记 洛克菲勒写给孩子的38封信 第1封信:起点不决定终点 人人生而平等,但这种平等是权利与法律意义上的平等,与经济和文化优势无关 第2封信:运气靠策划 ...

  4. 股神大家了解多少?深度剖析股神巴菲特

    股神巴菲特是金融界里的传奇,大家是否都对股神巴菲特感兴趣呢?大家对股神了解多少?小编最近在QR社区发现了<阿尔法狗与巴菲特>,里面记载了许多股神巴菲特的人生经历,今天小编简单说一说关于股神 ...

  5. 2014巴菲特股东大会及巴菲特创业分享

     沃伦·巴菲特,这位传奇人物.在美国,巴菲特被称为"先知".在中国,他更多的被喻为"股神",巴菲特在11岁时第一次购买股票以来,白手起家缔造了一个千亿规模的 ...

  6. 《成为沃伦·巴菲特》笔记与感想

    本文首发于微信公众帐号: 一界码农(The_hard_the_luckier) 无需授权即可转载: 甚至无需保留以上版权声明-- 沃伦·巴菲特传记的纪录片 http://www.bilibili.co ...

  7. 读书笔记002:托尼.巴赞之快速阅读

    读书笔记002:托尼.巴赞之快速阅读 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<快速阅读>之后,我们就可以可以快速提高阅读速度,保持并改善理解嗯嗯管理,通过增进了解眼睛和大脑功能 ...

  8. 读书笔记001:托尼.巴赞之开动大脑

    读书笔记001:托尼.巴赞之开动大脑 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<开动大脑>之后,我们就可以对我们的大脑有更多的了解:大脑可以进行比我们预期多得多的工作:我们可以最 ...

  9. 读书笔记003:托尼.巴赞之思维导图

    读书笔记003:托尼.巴赞之思维导图 托尼.巴赞的<思维导图>一书,详细的介绍了思维发展的新概念--放射性思维:如何利用思维导图实施你的放射性思维,实现你的创造性思维,从而给出一种深刻的智 ...

  10. 产品读书《滚雪球:巴菲特和他的财富人生》

    作者简介 艾丽斯.施罗德,曾经担任世界知名投行摩根士丹利的董事总经理,因为撰写研究报告与巴菲特相识.业务上的往来使得施罗德有更多的机会与巴菲特亲密接触,她不仅是巴菲特别的忘年交,她也是第一个向巴菲特建 ...

最新文章

  1. 【Kali渗透全方位实战】Linux终端和基本Linux命令terminator
  2. 清华大学计算机系男女,【清华大学男女比例】2016清华大学各院系男女比例
  3. React中jsx的规则
  4. 基于vue的video播放组件
  5. linux数据库能看到系统执行了哪些命令,DB2数据库在linux操作系统的指令有哪些?...
  6. CCF201604-5 网络连接(募集解题代码)
  7. yeoman、bower、grunt 开发收集
  8. Java集合框架最全详解(看这篇就够了)
  9. Android--存储权限
  10. 课设错误调试(一)No qualifying bean of type
  11. java Graphics2D 获取当前系统实际支持特殊字符和中文的字体
  12. IDM下载浮动条使用详解
  13. 需求分析 - 01外卖配送系统
  14. 解决拉取远程分支后出现.xcodeproj Couldn't load project的问题
  15. 原生Vue实现二维码扫一扫,兼容PC、安卓、IOS
  16. 计算机硬盘属于主机还是外部设备,计算机主机的外部连接分别是什么?
  17. 快门背后的机器学习:实时 HDR+ 和双重曝光控制
  18. chrome无法添加.crx文件(扩展程序)
  19. H3C_RIP_路由器_动态路由
  20. junit5_在JUnit中测试预期的异常

热门文章

  1. Linux环境下安装部署redis
  2. 换链接,群发和伪原创何时是尽头
  3. OSI的七层模型详解
  4. YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)
  5. Kettle 8.2 打开spoon.bat后闪退的解决办法
  6. [PowerBI]DAX虚拟连接函数:TREATAS()用法介绍
  7. 车牌定位系统matlab,基于Matlab的车牌定位系统的研究与设计论文
  8. C#中命名参数和可选参数
  9. jmetter持续时间_【转】Jmeter做web压力测试时设置持续时间注意点
  10. Tensorflow Test1