《Java性能权威指南》epub+mobi+azw3电子书

Java性能权威指南

作者简介  · · · · · ·

Scott Oaks是Oracle公司的一位架构师,专注研究Oracle中间件软件的性能。加入Oracle之前,他曾于Sun Microsystem公司任职多年,在多个技术领域都有建树,包括SunOS的内核、网络程序设计、Windows系统的远程方法调用(RPC)以及 OPEN LOOK虚拟窗口管理器。1996年,Scott成为Sun公司的Java布道师,并于2001年加入Sun公司的Java性能小组——从那时起他就一直专注于Java的性能提升。此外,Scott也在O’Reilly出版社出版了多部书籍,包括Java Security、Java Threads、JXTA in a Nutshell和Jini in a Nutshell。

目录  · · · · · ·

推荐序  xi
前言  xii
第1章 导论  1
1.1 概述  2
1.2 平台版本约定  2
1.3 全面的性能调优  4
1.3.1 编写更好的算法  4
1.3.2 编写更少的代码  4
1.3.3 老调重弹的过早优化  5
1.3.4 其他:数据库很可能就是瓶颈  6
1.3.5 常见的优化  7
1.4 小结  8
第2章 性能测试方法  9
2.1 原则1:测试真实应用  9
2.1.1 微基准测试  9
2.1.2 宏基准测试  13
2.1.3 介基准测试  15
2.1.4 代码示例  16
2.2 原则2:理解批处理流逝时间、吞吐量和响应时间  19
2.2.1 批处理流逝时间  19
2.2.2 吞吐量测试  20
2.2.3 响应时间测试  20
2.3 原则3:用统计方法应对性能的变化  23
2.4 原则4:尽早频繁测试  26
2.5 小结  28
第3章 Java性能调优工具箱  29
3.1 操作系统的工具和分析  29
3.1.1 CPU使用率  29
3.1.2 CPU运行队列  32
3.1.3 磁盘使用率  33
3.1.4 网络使用率  34
3.2 Java监控工具  35
3.2.1 基本的VM信息  36
3.2.2 线程信息  39
3.2.3 类信息  39
3.2.4 实时GC分析  39
3.2.5 事后堆转储  39
3.3 性能分析工具  39
3.3.1 采样分析器  40
3.3.2 探查分析器  41
3.3.3 阻塞方法和线程时间线  42
3.3.4 本地分析器  44
3.4 Java任务控制  45
3.4.1 Java飞行记录器  46
3.4.2 开启JFR  52
3.4.3 选择JFR 事件  54
3.5 小结  56
第4章 JIT编译器  58
4.1 JIT编译器:概览  58
4.2 调优入门:选择编译器类型(Client、Server或二者同用)  61
4.2.1 优化启动  62
4.2.2 优化批处理  63
4.2.3 优化长时间运行的应用  64
4.3 Java和JIT编译器版本  64
4.4 编译器中级调优  67
4.4.1 调优代码缓存  67
4.4.2 编译阈值  68
4.4.3 检测编译过程  70
4.5 高级编译器调优  73
4.5.1 编译线程  73
4.5.2 内联  74
4.5.3 逃逸分析  75
4.6 逆优化  76
4.6.1 代码被丢弃  77
4.6.2 逆优化僵尸代码  78
4.7 分层编译级别  79
4.8 小结  80
第5章 垃圾收集入门  81
5.1 垃圾收集概述  81
5.1.1 分代垃圾收集器  83
5.1.2 GC算法  84
5.1.3 选择GC算法  87
5.2 GC调优基础  92
5.2.1 调整堆的大小  92
5.2.2 代空间的调整  95
5.2.3 永久代和元空间的调整  96
5.2.4 控制并发  97
5.2.5 自适应调整  98
5.3 垃圾回收工具  99
5.4 小结  102
第6章 垃圾收集算法  103
6.1 理解Throughput收集器  103
6.2 理解CMS收集器  109
6.2.1 针对并发模式失效的调优  113
6.2.2 CMS收集器的永久代调优  116
6.2.3 增量式CMS垃圾收集  117
6.3 理解G1垃圾收集器  118
6.4 高级调优  126
6.4.1 晋升及Survivor空间  126
6.4.2 分配大对象  129
6.4.3 AggressiveHeap标志  136
6.4.4 全盘掌控堆空间的大小  137
6.5 小结  138
第7章 堆内存最佳实践  140
7.1 堆分析  140
7.1.1 堆直方图  141
7.1.2 堆转储  142
7.1.3 内存溢出错误  146
7.2 减少内存使用  149
7.2.1 减少对象大小  149
7.2.2 延迟初始化  152
7.2.3 不可变对象和标准化对象  156
7.2.4 字符串的保留  157
7.3 对象生命周期管理  160
7.3.1 对象重用  160
7.3.2 弱引用、软引用与其他引用  165
7.4 小结  175
第8章 原生内存最佳实践  176
8.1 内存占用  176
8.1.1 测量内存占用  177
8.1.2 内存占用最小化  178
8.1.3 原生NIO缓冲区  178
8.1.4 原生内存跟踪  179
8.2 针对不同操作系统优化JVM  182
8.2.1 大页  182
8.2.2 压缩的oop  185
8.3 小结  187
第9章 线程与同步的性能  188
9.1 线程池与ThreadPoolExecutor  188
9.1.1 设置最大线程数  189
9.1.2 设置最小线程数  192
9.1.3 线程池任务大小  193
9.1.4 设置ThreadPoolExecutor的大小  193
9.2 ForkJoinPool  195
9.3 线程同步  201
9.3.1 同步的代价  202
9.3.2 避免同步  205
9.3.3 伪共享  208
9.4 JVM线程调优  211
9.4.1 调节线程栈大小  211
9.4.2 偏向锁  212
9.4.3 自旋锁  212
9.4.4 线程优先级  213
9.5 监控线程与锁  213
9.5.1 查看线程  214
9.5.2 查看阻塞线程  214
9.6 小结  217
第10章 Java EE 性能调优  218
10.1 Web容器的基本性能  218
10.2 线程池  222
10.3 EJB会话Bean  223
10.3.1 调优EJB对象池  223
10.3.2 调优EJB缓存  225
10.3.3 本地和远程实例  226
10.4 XML和JSON处理  227
10.4.1 数据大小  227
10.4.2 解析和编组概述  229
10.4.3 选择解析器  230
10.4.4 XML验证  235
10.4.5 文档模型  237
10.4.6 Java对象模型  240
10.5 对象序列化  241
10.5.1 transient字段  241
10.5.2 覆盖默认的序列化  241
10.5.3 压缩序列化数据  244
10.5.4 追踪对象复制  246
10.6 Java EE网络API  248
10.7 小结  250
第11章 数据库性能的最佳实践  251
11.1 JDBC  251
11.1.1 JDBC驱动程序  252
11.1.2 预处理语句和语句池  253
11.1.3 JDBC连接池  255
11.1.4 事务  256
11.1.5 结果集的处理  262
11.2 JPA  264
11.2.1 事务处理  264
11.2.2 对JPA的写性能进行优化  267
11.2.3 对JPA的读性能进行优化  268
11.2.4 JPA缓存  271
11.2.5 JPA的只读实体  276
11.3 小结  277
第12章 Java SE API技巧  278
12.1 缓冲式I/O  278
12.2 类加载  280
12.3 随机数  284
12.4 Java原生接口  285
12.5 异常  287
12.6 字符串的性能  290
12.7 日志  291
12.8 Java集合类API  292
12.8.1 同步还是非同步  293
12.8.2 设定集合的大小  294
12.8.3 集合与内存使用效率  295
12.9 AggressiveOpts标志  296
12.9.1 替代实现  296
12.9.2 其他标志  297
12.10 Lambda表达式和匿名类  297
12.11 流和过滤器的性能  300
12.12 小结  302
附录A 性能调优标志摘要  303
作者简介  312
关于封面  312

《Java性能权威指南》读书笔记

第一章 导论

本书的侧重点是拓展知识的深度。本书的知识分为两大类:JVM自身的调优,Java平台(既指Java语言,比如线程和同步,也指JavaAPI,比如XML解析性能)的特性对性能的影响。

请记住,JVM只占整体性能的一小部分,更多的是操作系统、数据库,其他系统,不过本书不是讲整体分析的,本书假设性能瓶颈在Java。

第二章 性能测试方法

原则1:测试真实应用;

原则2:理解批处理流逝时间、吞吐量和响应时间

原则3:用统计方法应对性能的变化

原则4:尽早频繁测试

本章的目的,是给出一些性能测试的理论和定量方法。

第三章 Java性能调优工具箱

欲善其事,先利其器。几个月前做了几个网线,不知道压线是否通了,每条都试一下,真是麻烦,于是买了的测线仪,压完就知道结果,方便多了。

看Java,看JVM,我们也需要这样的工具。

1、看操作系统的:CPU、磁盘、网络,用linux的操纵系统命令。

2、看Java的:线程、类、堆、栈,用jstack,jcmd等命令。

3、采样、探查

4、JFR,Java飞行记录仪,收费版JVM才有的。

常用的Linux操作系统命令,以及Java性能相关的命令:jcmd、jstack、jmap、jstat、jinfo的常用参数,要纯熟。

第四章 JIT编译器

JIT编译,我们的调优参数并不多,还是要学习熟悉一下。

以前看《深入理解Java虚拟机》时,想知道机器默认是使用client/server模式,查了很多资料,未必准确,而本章就有介绍。

第五章 垃圾收集入门

本章介绍了垃圾收集的入门知识。比如选择GC算法,调整堆、永久代,控制并发等。

看过《深入理解Java虚拟机》,可能依然形成一些粗略了解形成的错误观念。举两个例子。

1、Stop The World,请问新生代的GC,会STW吗?老年代呢?

实际的结果是,所有的新生代GC算法,都是100%的STW,因为时间短,一般都是几毫秒~几十毫秒左右,对于大部分应用都是可以接受的。

老年代GC算法,常用的CMS,会尽量不STW,只有在经过一定失败条件,CMS无法继续进行时,会退化成使用SerialOld,才会STW,一次老年代GC,大约需要1秒,于存活对象大小成正比,如果老年代全部STW,这个1秒,真是无法承受。

技术是件很严肃的事情。

第六章 垃圾收集算法

详细讲了3类GC收集器的原理:以最大CPU利用率为目的的Throughput(parallel),最小响应延迟为目的的CMS,和CMS类似但是适用于大内存的G1。

一些高级调优选项。

在看本章的P116,“CMS收集器的永久代调优”时,从JVM角度消除了一个生产报警。场景描述如下:

有一个调用频繁的服务,一天大约调用100万次,每次都是通过反射,从Spring容器拿出一个对象(因为这个服务有状态,所以必须是prototype),经过代码跟踪,发现这种方式,在生成新对象的过程中,总会产生一个类似这样的新类: sun.reflect.GeneratedSerializationConstructorAccessor10079,大约5个小时,256m的永久代就会超过90%,监控开始报警,然后permgen到达100%时,会进行full gc,回收所有的堆(新生代、老年代、永久代)。

-XX:+CMSPermGenSweepingEnabled

-XX:CMSInitiatingPermOccupancyFraction=70

CMS接管Perm,70%时并发进行垃圾收集,避免满了再FullGC。在70%时,只会回收新生代和永久代,不会回收老年代。

第七章 堆内存最佳实践

本章首先介绍了使用jmap命令或者其他工具进行堆转储,然后通过Eclipse Memory Analyze工具分析转储文件,理解浅内存、保留内存、深内存,及EMA的用法。

然后介绍了几种常见的内存溢出场景。

然后从减少内存使用绝度(减小对象大小、延迟初始化、不可变对象和标准化对象、字符串的保留),以及对象生命周期管理(对象重用、弱引用/软引用/其他引用)绝度,讨论了堆内存最佳实践方法。

以上实际都是编程的绝度。

第八章 原生内存最佳实践

首先介绍了原生内存使用的理论知识。

在Java8中,通过开启-XX:NativeMemoryTracking=off|summary|detail,然后可以通过命令 jcmd pid VM.native_memory summary查看原生内存使用情况。

介绍了操作系统级别的JVM优化:大页和压缩的OOP。

页是OS管理内存的一个单元,也是OS分配内存的最小单元:要分配一个字节,OS一定会分配一个整页。

介绍了Linux大页和Linux透明大页(从2.6.32开始):cat(echo always > ) /sys/kernel/mm/transparent_hugepage/enabled

压缩的OOP(ordinary object pointer 普通对象指针),在java7和更新的版本中,只要堆小于32G,压缩的oop默认就是启用的,不用参数-XX:+UseCompressedOops,如果堆大于32G,要大于一定数值,因为需要额外的空间弥补非压缩引用所使用的空间,平均而言,对象引用会占用20%的堆空间,38G是个不错的起点。

第九章 线程于同步的性能

拿到这本书后,基于对线程知识的理解(过去看过关于线程的书,查询过很多资料,总结过博客:http://blog.csdn.net/puma_dong/article/details/37597261),所以最先看的就是这一章。

本章开始讲了线程池、ThreadPoolExecutor(根据应用场景:CPU/IO密集等,设置最大线程数、最小线程数、线程池任务大小、设置ThreadPoolExecutor大小)、ForkJoinPool、线程同步,以及JVM线程调优(调节线程栈大小、偏向锁、自旋锁、线程优先级)。

最后讲解了线程监视于分析,最常用的是jstack,我们需要数量的看懂jstack的输出结果,并能快速的分析出存在的问题。

第十章 Java EE性能调优

本章介绍了一些Java EE技术,及常见的调优,比如Servlet、Jsp、Http、EJB(过时的技术)、数据交换技术(XML、JSON)、对象序列化、数据传输(Http、WebService、RESTFull)

本章,个人觉得,其他简单看看,着重看看对象序列化就行了。

第十一章 数据库性能的最佳实践

本章所讲的理论,更像是数据库相关的理论。

在日常的应用开发中,关于数据库相关,我们往往是应用持久化框架,所以从开发绝度考虑DB性能调优,更多的是在持久化框架配置方面。

第十二章 Java SE API技巧

本章讲解了一些Java SE API技巧。

比如缓冲式I/O、类加载(双亲委派、并行加载)、随机数(伪随机、真正的随机)、Java原生接口、异常、字符串的性能、日志、集合类等。

 






文件名称:《Java性能权威指南》epub+mobi+azw3电子书

下载地址:百度网盘

资源来源:网络收集

网盘资源均收集于网络,只作学习和交流使用,版权归原作者所有,请在下载后24小时之内删除!若作商业用途,请到原网站购买,由于未及时购买和付费发生的侵权行为,与本站无关。

点击下载

0
分享到:

评论0

请先

没有账号? 忘记密码?