Java程序员修炼之道pdf高清版
分享到:
Java程序员修炼之道分为四部分,第一部分全面介绍Java7的新特性,第二部分探讨Java关键编程知识和技术,第三部分讨论JVM上的新语言和多语言编程,第四部分将平台和多语言编程知识付诸实践。从介绍Java7的新特性入手,本书涵盖了Java开发中最重要的技术,比如依赖注入、测试驱动的开发和持续集成,探索了JVM上的非Java语言,并详细讲解了多语言项目,特别是涉及Groovy、Scala和Clojure语言的项目。此外,书中含有大量代码示例,帮助读者从实践中理解Java语言和平台。适合Java开发人员以及对Java7和JVM新语言感兴趣的各领域人士阅读。
Martijn.Verburg(费尔堡),jClarity的CTO、伦敦Java用户组领导人。作为一名技术专家和众多初创企业的OSS导师,他拥有十多年的经验。Martijn经常应邀出席Java界的大型会议(JavaOne、Devoxx、OSCON、FOSDEM等)并发表演讲。
作者: (英)埃文斯 (荷)费尔堡
译者: 吴海星
图书分类: 软件
资源格式: PDF
版本: 扫描版
出版社: 人民邮电出版社
书号: 9787115321954
发行时间: 2013年08月
地区: 大陆
语言: 简体中文
第1章 初识Java7 2
1.1 语言与平台 2
1.2 Coin项目:浓缩的都是精华 4
1.3 Coin项目中的修改 7
1.3.1 switch语句中的String 7
1.3.2 更强的数值文本表示法 8
1.3.3 改善后的异常处理 9
1.3.4 try—with—resources(TWR) 11
1.3.5 钻石语法 13
1.3.6 简化变参方法调用 14
1.4 小结 15
第2章 新I/O 17
2.1 JavaI/O简史 18
2.1.1 Java1.0到1.3 19
2.1.2 在Java1.4中引入的NIO 19
2.1.3 下一代I/O—NIO.2 20
2.2 文件I/O的基石:Path 20
2.2.1 创建一个Path 23
2.2.2 从Path中获取信息 23
2.2.3 移除冗余项 24
2.2.4 转换Path 25
2.2.5 NIO.2Path和Java已有的File类 25
2.3 处理目录和目录树 26
2.3.1 在目录中查找文件 26
2.3.2 遍历目录树 27
2.4 NIO.2的文件系统I/O 28
2.4.1 创建和删除文件 29
2.4.2 文件的复制和移动 30
2.4.3 文件的属性 31
2.4.4 快速读写数据 34
2.4.5 文件修改通知 35
2.4.6 SeekableByteChannel 37
2.5 异步I/O操作 37
2.5.1 将来式 38
2.5.2 回调式 40
2.6 Socket和Channel的整合 41
2.6.1 NetworkChannel 42
2.6.2 MulticastChannel 42
2.7 小结 43
第二部分 关键技术
第3章 依赖注入 46
3.1 知识注入:理解IoC和DI 46
3.1.1 控制反转 47
3.1.2 依赖注入 48
3.1.3 转成DI 49
3.2 Java中标准化的DI 53
3.2.1 @Inject注解 54
3.2.2 @Qualifier注解 55
3.2.3 @Named注解 57
3.2.4 @Scope注解 57
3.2.5 @Singleton注解 57
3.2.6 接口Provider 58
3.3 Java中的DI参考实现:Guice3 59
3.3.1 Guice新手指南 59
3.3.2 水手绳结:Guice的各种绑定 62
3.3.3 在Guice中限定注入对象的生命周期 64
3.4 小结 66
第4章 现代并发 67
4.1 并发理论简介 68
4.1.1 解释Java线程模型 68
4.1.2 设计理念 69
4.1.3 这些原则如何以及为何会相互冲突 70
4.1.4 系统开销之源 71
4.1.5 一个事务处理的例子 71
4.2 块结构并发(Java5之前) 72
4.2.1 同步与锁 73
4.2.2 线程的状态模型 74
4.2.3 完全同步对象 74
4.2.4 死锁 76
4.2.5 为什么是synchronized 77
4.2.6 关键字volatile 78
4.2.7 不可变性 79
4.3 现代并发应用程序的构件 80
4.3.1 原子类:java.util.concurrent.atomic 81
4.3.2 线程锁:java.util.concurrent.locks 81
4.3.3 CountDownLatch 85
4.3.4 ConcurrentHashMap 86
4.3.5 CopyOnWriteArrayList 87
4.3.6 Queue 90
4.4 控制执行 95
4.4.1 任务建模 96
4.4.2 ScheduledThread—PoolExecutor 97
4.5 分支/合并框架 98
4.5.1 一个简单的分支/合并例子 99
4.5.2 ForkJoinTask与工作窃取 101
4.5.3 并行问题 102
4.6 Java内存模型 103
4.7 小结 104
第5章 类文件与字节码 106
5.1 类加载和类对象 107
5.1.1 加载和连接概览 107
5.1.2 验证 108
5.1.3 Class对象 108
5.1.4 类加载器 109
5.1.5 示例:依赖注入中的类加载器 110
5.2 使用方法句柄 111
5.2.1 MethodHandle 112
5.2.2 MethodType 112
5.2.3 查找方法句柄 113
5.2.4 示例:反射、代理与方法句柄 114
5.2.5 为什么选择MethodHandle 116
5.3 检查类文件 117
5.3.1 介绍javap 117
5.3.2 方法签名的内部形式 118
5.3.3 常量池 119
5.4 字节码 121
5.4.1 示例:反编译类 121
5.4.2 运行时环境 123
5.4.3 操作码介绍 124
5.4.4 加载和储存操作码 125
5.4.5 数学运算操作码 125
5.4.6 执行控制操作码 126
5.4.7 调用操作码 126
5.4.8 平台操作操作码 127
5.4.9 操作码的快捷形式 127
5.4.10 示例:字符串拼接 127
5.5 invokedynamic 129
5.5.1 invokedynamic如何工作 129
5.5.2 示例:反编译invokedynamic调用 130
5.6 小结 132
第6章 理解性能调优 133
6.1 性能术语 134
6.1.1 等待时间 135
6.1.2 吞吐量 135
6.1.3 利用率 135
6.1.4 效率 135
6.1.5 容量 136
6.1.6 扩展性 136
6.1.7 退化 136
6.2 务实的性能分析法 136
6.2.1 知道你在测量什么 137
6.2.2 知道怎么测量 137
6.2.3 知道性能目标是什么 138
6.2.4 知道什么时候停止优化 139
6.2.5 知道高性能的成本 139
6.2.6 知道过早优化的危险 140
6.3 哪里出错了?我们担心的原因 140
6.3.1 过去和未来的性能趋势:摩尔定律 141
6.3.2 理解内存延迟层级 142
6.3.3 为什么Java性能调优存在困难 143
6.4 一个来自于硬件的时间问题 144
6.4.1 硬件时钟 144
6.4.2 麻烦的nanoTime() 144
6.4.3 时间在性能调优中的作用 146
6.4.4 案例研究:理解缓存未命中 147
6.5 垃圾收集 149
6.5.1 基本算法 149
6.5.2 标记和清除 150
6.5.3 jmap 152
6.5.4 与GC相关的JVM参数 155
6.5.5 读懂GC日志 156
6.5.6 用VisualVM查看内存使用情况 157
6.5.7 逸出分析 159
6.5.8 并发标记清除 160
6.5.9 新的收集器:G1 161
6.6 HotSpot的JIT编译 162
6.6.1 介绍HotSpot 163
6.6.2 内联方法 164
6.6.3 动态编译和独占调用 165
6.6.4 读懂编译日志 166
6.7 小结 167
第三部分 JVM上的多语言编程
第7章 备选JVM语言 170
7.1 Java太笨?纯粹诽谤 170
7.1.1 整合系统 171
7.1.2 函数式编程的基本原理 172
7.1.3 映射与过滤器 173
7.2 语言生态学 174
7.2.1 解释型与编译型语言 175
7.2.2 动态与静态类型 175
7.2.3 命令式与函数式语言 176
7.2.4 重新实现的语言与原生语言 176
7.3 JVM上的多语言编程 177
7.3.1 为什么要用非Java语言 178
7.3.2 崭露头角的语言新星 179
7.4 如何挑选称心的非Java语言 180
7.4.1 低风险 181
7.4.2 与Java的交互操作 181
7.4.3 良好的工具和测试支持 182
7.4.4 备选语言学习难度 182
7.4.5 使用备选语言的开发者 182
7.5 JVM对备选语言的支持 183
7.5.1 非Java语言的运行时环境 183
7.5.2 编译器小说 184
7.6 小结 185
第8章 Groovy:Java的动态伴侣 187
8.1 Groovy入门 189
8.1.1 编译和运行 189
8.1.2 Groovy控制台 190
8.2 Groovy101:语法和语义 191
8.2.1 默认导入 192
8.2.2 数字处理 192
8.2.3 变量、动态与静态类型、作用域 193
8.2.4 列表和映射语法 195
8.3 与Java的差异——新手陷阱 196
8.3.1 可选的分号和返回语句 196
8.3.2 可选的参数括号 197
8.3.3 访问限定符 197
8.3.4 异常处理 198
8.3.5 Groovy中的相等 198
8.3.6 内部类 199
8.4 Java不具备的Groovy特性 199
8.4.1 GroovyBean 199
8.4.2 安全解引用操作符 200
8.4.3 猫王操作符 201
8.4.4 增强型字符串 201
8.4.5 函数字面值 202
8.4.6 内置的集合操作 203
8.4.7 对正则表达式的内置支持 204
8.4.8 简单的XML处理 205
8.5 Groovy与Java的合作 207
8.5.1 从Groovy调用Java 207
8.5.2 从Java调用Groovy 208
8.6 小结 211
第9章 Scala:简约而不简单 212
9.1 走马观花Scala 213
9.1.1 简约的Scala 213
9.1.2 match表达式 215
9.1.3 case类 217
9.1.4 actor 218
9.2 Scala能用在我的项目中吗 219
9.2.1 Scala和Java的比较 219
9.2.2 何时以及如何开始使用Scala 220
9.2.3 Scala可能不适合当前项目的迹象 220
9.3 让代码因Scala重新绽放 221
9.3.1 使用编译器和REPL 221
9.3.2 类型推断 222
9.3.3 方法 223
9.3.4 导入 224
9.3.5 循环和控制结构 224
9.3.6 Scala的函数式编程 225
9.4 Scala对象模型:相似但不同 226
9.4.1 一切皆对象 226
9.4.2 构造方法 228
9.4.3 特质 228
9.4.4 单例和伴生对象 230
9.4.5 case类和match表达式 232
9.4.6 警世寓言 234
9.5 数据结构和集合 235
9.5.1 List 235
9.5.2 Map 238
9.5.3 泛型 239
9.6 actor介绍 242
9.6.1 代码大舞台 242
9.6.2 用mailbox跟actor通信 243
9.7 小结 244
第10章 Clojure:更安全地编程 245
10.1 Clojure介绍 245
10.1.1 Clojure的HelloWorld 246
10.1.2 REPL入门 247
10.1.3 犯了错误 248
10.1.4 学着去爱括号 248
10.2 寻找Clojure:语法和语义 249
10.2.1 特殊形式新手营 249
10.2.2 列表、向量、映射和集 250
10.2.3 数学运算、相等和其他操作 252
10.3 使用函数和循环 253
10.3.1 一些简单的Clojure函数 253
10.3.2 Clojure中的循环 255
10.3.3 读取器宏和派发器 256
10.3.4 函数式编程和闭包 257
10.4 Clojure序列 258
10.4.1 懒序列 260
10.4.2 序列和变参函数 261
10.5 Clojure与Java的互操作 262
10.5.1 从Clojure中调用Java 262
10.5.2 Clojure值的Java类型 263
10.5.3 使用Clojure代理 264
10.5.4 用REPL做探索式编程 264
10.5.5 在Java中使用Clojure 265
10.6 Clojure并发 265
10.6.1 未来式与并行调用 266
10.6.2 ref形式 267
10.6.3 代理 271
10.7 小结 272
第四部分 多语种项目开发
第11章 测试驱动开发 274
11.1 TDD概览 275
11.1.1 一个测试用例 276
11.1.2 多个测试用例 280
11.1.3 深入思考红—绿—重构循环 282
11.1.4 JUnit 283
11.2 测试替身 285
11.2.1 虚设对象 286
11.2.2 存根对象 287
11.2.3 伪装替身 290
11.2.4 模拟对象 295
11.3 ScalaTest 296
11.4 小结 298
第12章 构建和持续集成 300
12.1 与Maven3相遇 302
12.2 Maven3入门项目 303
12.3 用Maven3构建Java7developer项目 305
12.3.1 POM 305
12.3.2 运行示例 311
12.4 Jenkins:满足CI需求 314
12.4.1 基础配置 315
12.4.2 设置任务 316
12.4.3 执行任务 319
12.5 Maven和Jenkins代码指标 320
12.5.1 安装Jenkins插件 321
12.5.2 用Checkstyle保持代码一致性 322
12.5.3 用FindBugs设定质量标杆 323
12.6 Leiningen 325
12.6.1 Leiningen入门 326
12.6.2 Leiningen的架构 326
12.6.3 HelloLein 327
12.6.4 用Leiningen做面向REPL的TDD 329
12.6.5 用Leiningen打包和部署 330
12.7 小结 332
第13章 快速Web开发 333
13.1 JavaWeb框架的问题 334
13.1.1 Java编译为什么不好 335
13.1.2 静态类型为什么不好 335
13.2 选择Web框架的标准 336
13.3 Grails入门 338
13.4 Grails快速启动项目 338
13.4.1 创建域对象 340
13.4.2 测试驱动开发 340
13.4.3 域对象持久化 342
13.4.4 创建测试数据 343
13.4.5 控制器 343
13.4.6 GSP/JSP页面 344
13.4.7 脚手架和UI的自动化创建 346
13.4.8 快速周转的开发 347
13.5 深入Grails 347
13.5.1 日志 347
13.5.2 GORM:对象关系映射 348
13.5.3 Grails插件 349
13.6 Compojure入门 350
13.6.1 HelloCompojure 350
13.6.2 Ring和路由 352
13.6.3 Hiccup 353
13.7 我是不是一只水獭 353
13.7.1 项目设置 354
13.7.2 核心函数 357
13.8 小结 359
第14章 保持优秀 361
14.1 对Java8的期待 361
14.1.1 lambda表达式(闭包) 362
14.1.2 模块化(拼图Jigsaw) 363
14.2 多语言编程 365
14.2.1 语言的互操作性及元对象协议 365
14.2.2 多语言模块化 366
14.3 未来的并发趋势 367
14.3.1 多核的世界 367
14.3.2 运行时管理的并发 367
14.4 JVM的新方向 368
14.4.1 VM的合并 368
14.4.2 协同程序 369
14.4.3 元组 370
14.5 小结 372
附录A java7developer:源码安装 373
附录B glob模式语法及示例 380
附录C 安装备选JVM语言 382
附录D Jenkins的下载和安装 388
附录E java7developer:MavenPOM 390
今天,掌握JVM上的新语言对Java开发人员的意义非比寻常。因此深入探讨Java关键技术,还用较大篇幅全面讨论了JVM上的多语言开发和项目控制,包括Groovy、Scala和Clojure这些优秀的新语言。这些技术可以帮助Java开发人员构建下一代商业软件。Java开发人员若要修炼进阶,本书绝对不容错过!
——Heinz Kabutz博士,知名Java技术教育家、The Java Specialists' Newsletter创始人
如果你想在Java专业领域占有一席之地,《Java程序员修炼之道》绝对值得拥有。
——Stephen Harrison,FirstFuel软件公司首席软件架构师
要打开G1,需要用到表6—5中的选项。
这些选项可以组合,比如设置最大暂停目标是50ms,暂停间隔不能少于200ms。当然,GC系统所能承受的压力是有限的。必须有充足的暂停时间把垃圾取出来。每隔100年1ms的暂停目标肯定是不现实的。
G1可以支持的负载和应用类型范围很广。如果你的应用程序已经到了需要对GC调优的地步,G1会是一个不错的选择。
在下一节中,我们会介绍JIT编译。对于很多或大多数程序来说,这是唯一一个可以为产生高性能代码做出最大贡献的因素。我们会学习JIT编译的基础知识,最后解释一下如何打开JIT编译的日志,让你能够判断正在编译哪个方法。
6.6 HotSpot的JIT编译
正如我们在第1章所讲,Jav提一种“动态编译”语言。也就是说在程序运行时,其中的类还会再进行一次编译,然后转换成机器码。这个过程称为即时编译或JITing,并且通常是一次处理一个方法。要在庞大的代码库中找出其中的重要部分,理解这个过程是关键。
下面是一些与JIT编译有关的基本事实。
几乎所有现代JVM中都有某种JIT编译器。
相比较而言,纯粹解释型的VM要慢得多。
编译过的方法在运行速度上要比解释型的代码快很多,非常多。
先编译用得最多的方法,这是有道理的。
在做JIT编译时,先处理唾手可得的编译很重要。
按照最后一点,我们应该先研究编译过的代码,因为在正常情况下,所有仍然处于解释状态下的方法都没有已经编译过的方法运行频繁。偶尔会有无法编译的方法,但非常罕见。
方法一开始都是以字节码形态存在的,有调用时ⅣM只会对字节码进行解释并执行,同时记录方法被调用的次数及其他一些统计数据。当被调用次数达到某个阈值(默认10000次)后,如果它是合格的方法,就会有个JVM线程在后台把它的字节码编译成机器码。如果编译成功,以后所有对该方法的调用都会用它的编译结果,除非出现了某些导致检验失效的情况,或者出现了逆优化①。
根据实际情况,方法编译后产生的机器码运行速度可能比解释模式下的字节码快100倍。改善性能通常都要先弄明白程序中哪些方法比较重要,以及哪些重要的方法被编译了。
在接下来对JITing机制的讨论中,我们所说的JVM特指Hotspot。后续讨论中很多通用内容也适用于其他VM,但在具体细节上可能会有很大出入。
我们会先介绍一下Hotspot提供的几个JIT编译器,然后解释Hotspot中最有力的两项优化技术(内联和独占派发)。在本节的结尾,我们会告诉你如何打开方法编译日志,以便你可以看到被编译的确切方法。下面有请HotSpot。
Java程序员修炼之道禁用于商业用途!如果您喜欢《Java程序员修炼之道》,请购买正版,谢谢合作。
爱学习,请到3322软件站 / 查找资源自行下载!
Java程序员修炼之道作者简介:
Benjamin.J.Evans(埃文斯),伦敦Java用户组发起人、Java社区过程执行委员会成员。他拥有多年Java开发经验,现在是一家面向金融业的Java技术公司的CEO。Martijn.Verburg(费尔堡),jClarity的CTO、伦敦Java用户组领导人。作为一名技术专家和众多初创企业的OSS导师,他拥有十多年的经验。Martijn经常应邀出席Java界的大型会议(JavaOne、Devoxx、OSCON、FOSDEM等)并发表演讲。
Java程序员修炼之道简介:
中文名: Java程序员修炼之道作者: (英)埃文斯 (荷)费尔堡
译者: 吴海星
图书分类: 软件
资源格式: PDF
版本: 扫描版
出版社: 人民邮电出版社
书号: 9787115321954
发行时间: 2013年08月
地区: 大陆
语言: 简体中文
Java程序员修炼之道目录:
第一部分 用Java7做开发第1章 初识Java7 2
1.1 语言与平台 2
1.2 Coin项目:浓缩的都是精华 4
1.3 Coin项目中的修改 7
1.3.1 switch语句中的String 7
1.3.2 更强的数值文本表示法 8
1.3.3 改善后的异常处理 9
1.3.4 try—with—resources(TWR) 11
1.3.5 钻石语法 13
1.3.6 简化变参方法调用 14
1.4 小结 15
第2章 新I/O 17
2.1 JavaI/O简史 18
2.1.1 Java1.0到1.3 19
2.1.2 在Java1.4中引入的NIO 19
2.1.3 下一代I/O—NIO.2 20
2.2 文件I/O的基石:Path 20
2.2.1 创建一个Path 23
2.2.2 从Path中获取信息 23
2.2.3 移除冗余项 24
2.2.4 转换Path 25
2.2.5 NIO.2Path和Java已有的File类 25
2.3 处理目录和目录树 26
2.3.1 在目录中查找文件 26
2.3.2 遍历目录树 27
2.4 NIO.2的文件系统I/O 28
2.4.1 创建和删除文件 29
2.4.2 文件的复制和移动 30
2.4.3 文件的属性 31
2.4.4 快速读写数据 34
2.4.5 文件修改通知 35
2.4.6 SeekableByteChannel 37
2.5 异步I/O操作 37
2.5.1 将来式 38
2.5.2 回调式 40
2.6 Socket和Channel的整合 41
2.6.1 NetworkChannel 42
2.6.2 MulticastChannel 42
2.7 小结 43
第二部分 关键技术
第3章 依赖注入 46
3.1 知识注入:理解IoC和DI 46
3.1.1 控制反转 47
3.1.2 依赖注入 48
3.1.3 转成DI 49
3.2 Java中标准化的DI 53
3.2.1 @Inject注解 54
3.2.2 @Qualifier注解 55
3.2.3 @Named注解 57
3.2.4 @Scope注解 57
3.2.5 @Singleton注解 57
3.2.6 接口Provider 58
3.3 Java中的DI参考实现:Guice3 59
3.3.1 Guice新手指南 59
3.3.2 水手绳结:Guice的各种绑定 62
3.3.3 在Guice中限定注入对象的生命周期 64
3.4 小结 66
第4章 现代并发 67
4.1 并发理论简介 68
4.1.1 解释Java线程模型 68
4.1.2 设计理念 69
4.1.3 这些原则如何以及为何会相互冲突 70
4.1.4 系统开销之源 71
4.1.5 一个事务处理的例子 71
4.2 块结构并发(Java5之前) 72
4.2.1 同步与锁 73
4.2.2 线程的状态模型 74
4.2.3 完全同步对象 74
4.2.4 死锁 76
4.2.5 为什么是synchronized 77
4.2.6 关键字volatile 78
4.2.7 不可变性 79
4.3 现代并发应用程序的构件 80
4.3.1 原子类:java.util.concurrent.atomic 81
4.3.2 线程锁:java.util.concurrent.locks 81
4.3.3 CountDownLatch 85
4.3.4 ConcurrentHashMap 86
4.3.5 CopyOnWriteArrayList 87
4.3.6 Queue 90
4.4 控制执行 95
4.4.1 任务建模 96
4.4.2 ScheduledThread—PoolExecutor 97
4.5 分支/合并框架 98
4.5.1 一个简单的分支/合并例子 99
4.5.2 ForkJoinTask与工作窃取 101
4.5.3 并行问题 102
4.6 Java内存模型 103
4.7 小结 104
第5章 类文件与字节码 106
5.1 类加载和类对象 107
5.1.1 加载和连接概览 107
5.1.2 验证 108
5.1.3 Class对象 108
5.1.4 类加载器 109
5.1.5 示例:依赖注入中的类加载器 110
5.2 使用方法句柄 111
5.2.1 MethodHandle 112
5.2.2 MethodType 112
5.2.3 查找方法句柄 113
5.2.4 示例:反射、代理与方法句柄 114
5.2.5 为什么选择MethodHandle 116
5.3 检查类文件 117
5.3.1 介绍javap 117
5.3.2 方法签名的内部形式 118
5.3.3 常量池 119
5.4 字节码 121
5.4.1 示例:反编译类 121
5.4.2 运行时环境 123
5.4.3 操作码介绍 124
5.4.4 加载和储存操作码 125
5.4.5 数学运算操作码 125
5.4.6 执行控制操作码 126
5.4.7 调用操作码 126
5.4.8 平台操作操作码 127
5.4.9 操作码的快捷形式 127
5.4.10 示例:字符串拼接 127
5.5 invokedynamic 129
5.5.1 invokedynamic如何工作 129
5.5.2 示例:反编译invokedynamic调用 130
5.6 小结 132
第6章 理解性能调优 133
6.1 性能术语 134
6.1.1 等待时间 135
6.1.2 吞吐量 135
6.1.3 利用率 135
6.1.4 效率 135
6.1.5 容量 136
6.1.6 扩展性 136
6.1.7 退化 136
6.2 务实的性能分析法 136
6.2.1 知道你在测量什么 137
6.2.2 知道怎么测量 137
6.2.3 知道性能目标是什么 138
6.2.4 知道什么时候停止优化 139
6.2.5 知道高性能的成本 139
6.2.6 知道过早优化的危险 140
6.3 哪里出错了?我们担心的原因 140
6.3.1 过去和未来的性能趋势:摩尔定律 141
6.3.2 理解内存延迟层级 142
6.3.3 为什么Java性能调优存在困难 143
6.4 一个来自于硬件的时间问题 144
6.4.1 硬件时钟 144
6.4.2 麻烦的nanoTime() 144
6.4.3 时间在性能调优中的作用 146
6.4.4 案例研究:理解缓存未命中 147
6.5 垃圾收集 149
6.5.1 基本算法 149
6.5.2 标记和清除 150
6.5.3 jmap 152
6.5.4 与GC相关的JVM参数 155
6.5.5 读懂GC日志 156
6.5.6 用VisualVM查看内存使用情况 157
6.5.7 逸出分析 159
6.5.8 并发标记清除 160
6.5.9 新的收集器:G1 161
6.6 HotSpot的JIT编译 162
6.6.1 介绍HotSpot 163
6.6.2 内联方法 164
6.6.3 动态编译和独占调用 165
6.6.4 读懂编译日志 166
6.7 小结 167
第三部分 JVM上的多语言编程
第7章 备选JVM语言 170
7.1 Java太笨?纯粹诽谤 170
7.1.1 整合系统 171
7.1.2 函数式编程的基本原理 172
7.1.3 映射与过滤器 173
7.2 语言生态学 174
7.2.1 解释型与编译型语言 175
7.2.2 动态与静态类型 175
7.2.3 命令式与函数式语言 176
7.2.4 重新实现的语言与原生语言 176
7.3 JVM上的多语言编程 177
7.3.1 为什么要用非Java语言 178
7.3.2 崭露头角的语言新星 179
7.4 如何挑选称心的非Java语言 180
7.4.1 低风险 181
7.4.2 与Java的交互操作 181
7.4.3 良好的工具和测试支持 182
7.4.4 备选语言学习难度 182
7.4.5 使用备选语言的开发者 182
7.5 JVM对备选语言的支持 183
7.5.1 非Java语言的运行时环境 183
7.5.2 编译器小说 184
7.6 小结 185
第8章 Groovy:Java的动态伴侣 187
8.1 Groovy入门 189
8.1.1 编译和运行 189
8.1.2 Groovy控制台 190
8.2 Groovy101:语法和语义 191
8.2.1 默认导入 192
8.2.2 数字处理 192
8.2.3 变量、动态与静态类型、作用域 193
8.2.4 列表和映射语法 195
8.3 与Java的差异——新手陷阱 196
8.3.1 可选的分号和返回语句 196
8.3.2 可选的参数括号 197
8.3.3 访问限定符 197
8.3.4 异常处理 198
8.3.5 Groovy中的相等 198
8.3.6 内部类 199
8.4 Java不具备的Groovy特性 199
8.4.1 GroovyBean 199
8.4.2 安全解引用操作符 200
8.4.3 猫王操作符 201
8.4.4 增强型字符串 201
8.4.5 函数字面值 202
8.4.6 内置的集合操作 203
8.4.7 对正则表达式的内置支持 204
8.4.8 简单的XML处理 205
8.5 Groovy与Java的合作 207
8.5.1 从Groovy调用Java 207
8.5.2 从Java调用Groovy 208
8.6 小结 211
第9章 Scala:简约而不简单 212
9.1 走马观花Scala 213
9.1.1 简约的Scala 213
9.1.2 match表达式 215
9.1.3 case类 217
9.1.4 actor 218
9.2 Scala能用在我的项目中吗 219
9.2.1 Scala和Java的比较 219
9.2.2 何时以及如何开始使用Scala 220
9.2.3 Scala可能不适合当前项目的迹象 220
9.3 让代码因Scala重新绽放 221
9.3.1 使用编译器和REPL 221
9.3.2 类型推断 222
9.3.3 方法 223
9.3.4 导入 224
9.3.5 循环和控制结构 224
9.3.6 Scala的函数式编程 225
9.4 Scala对象模型:相似但不同 226
9.4.1 一切皆对象 226
9.4.2 构造方法 228
9.4.3 特质 228
9.4.4 单例和伴生对象 230
9.4.5 case类和match表达式 232
9.4.6 警世寓言 234
9.5 数据结构和集合 235
9.5.1 List 235
9.5.2 Map 238
9.5.3 泛型 239
9.6 actor介绍 242
9.6.1 代码大舞台 242
9.6.2 用mailbox跟actor通信 243
9.7 小结 244
第10章 Clojure:更安全地编程 245
10.1 Clojure介绍 245
10.1.1 Clojure的HelloWorld 246
10.1.2 REPL入门 247
10.1.3 犯了错误 248
10.1.4 学着去爱括号 248
10.2 寻找Clojure:语法和语义 249
10.2.1 特殊形式新手营 249
10.2.2 列表、向量、映射和集 250
10.2.3 数学运算、相等和其他操作 252
10.3 使用函数和循环 253
10.3.1 一些简单的Clojure函数 253
10.3.2 Clojure中的循环 255
10.3.3 读取器宏和派发器 256
10.3.4 函数式编程和闭包 257
10.4 Clojure序列 258
10.4.1 懒序列 260
10.4.2 序列和变参函数 261
10.5 Clojure与Java的互操作 262
10.5.1 从Clojure中调用Java 262
10.5.2 Clojure值的Java类型 263
10.5.3 使用Clojure代理 264
10.5.4 用REPL做探索式编程 264
10.5.5 在Java中使用Clojure 265
10.6 Clojure并发 265
10.6.1 未来式与并行调用 266
10.6.2 ref形式 267
10.6.3 代理 271
10.7 小结 272
第四部分 多语种项目开发
第11章 测试驱动开发 274
11.1 TDD概览 275
11.1.1 一个测试用例 276
11.1.2 多个测试用例 280
11.1.3 深入思考红—绿—重构循环 282
11.1.4 JUnit 283
11.2 测试替身 285
11.2.1 虚设对象 286
11.2.2 存根对象 287
11.2.3 伪装替身 290
11.2.4 模拟对象 295
11.3 ScalaTest 296
11.4 小结 298
第12章 构建和持续集成 300
12.1 与Maven3相遇 302
12.2 Maven3入门项目 303
12.3 用Maven3构建Java7developer项目 305
12.3.1 POM 305
12.3.2 运行示例 311
12.4 Jenkins:满足CI需求 314
12.4.1 基础配置 315
12.4.2 设置任务 316
12.4.3 执行任务 319
12.5 Maven和Jenkins代码指标 320
12.5.1 安装Jenkins插件 321
12.5.2 用Checkstyle保持代码一致性 322
12.5.3 用FindBugs设定质量标杆 323
12.6 Leiningen 325
12.6.1 Leiningen入门 326
12.6.2 Leiningen的架构 326
12.6.3 HelloLein 327
12.6.4 用Leiningen做面向REPL的TDD 329
12.6.5 用Leiningen打包和部署 330
12.7 小结 332
第13章 快速Web开发 333
13.1 JavaWeb框架的问题 334
13.1.1 Java编译为什么不好 335
13.1.2 静态类型为什么不好 335
13.2 选择Web框架的标准 336
13.3 Grails入门 338
13.4 Grails快速启动项目 338
13.4.1 创建域对象 340
13.4.2 测试驱动开发 340
13.4.3 域对象持久化 342
13.4.4 创建测试数据 343
13.4.5 控制器 343
13.4.6 GSP/JSP页面 344
13.4.7 脚手架和UI的自动化创建 346
13.4.8 快速周转的开发 347
13.5 深入Grails 347
13.5.1 日志 347
13.5.2 GORM:对象关系映射 348
13.5.3 Grails插件 349
13.6 Compojure入门 350
13.6.1 HelloCompojure 350
13.6.2 Ring和路由 352
13.6.3 Hiccup 353
13.7 我是不是一只水獭 353
13.7.1 项目设置 354
13.7.2 核心函数 357
13.8 小结 359
第14章 保持优秀 361
14.1 对Java8的期待 361
14.1.1 lambda表达式(闭包) 362
14.1.2 模块化(拼图Jigsaw) 363
14.2 多语言编程 365
14.2.1 语言的互操作性及元对象协议 365
14.2.2 多语言模块化 366
14.3 未来的并发趋势 367
14.3.1 多核的世界 367
14.3.2 运行时管理的并发 367
14.4 JVM的新方向 368
14.4.1 VM的合并 368
14.4.2 协同程序 369
14.4.3 元组 370
14.5 小结 372
附录A java7developer:源码安装 373
附录B glob模式语法及示例 380
附录C 安装备选JVM语言 382
附录D Jenkins的下载和安装 388
附录E java7developer:MavenPOM 390
Java程序员修炼之道编辑推荐:
随着核心平台以及生态系统的不断创新,Java技术一直在快速向前发展。《Java程序员修炼之道》涵盖了Java7的最新特性和Java开发的关键技术,对当前大量开源技术并存,多核处理器、并发以及海量数据给Java开发带来的挑战作出了精辟的分析,提供了实践前沿的深刻洞见,涉及依赖注入、现代并发、类与字节码、性能调优等底层概念的剖析。今天,掌握JVM上的新语言对Java开发人员的意义非比寻常。因此深入探讨Java关键技术,还用较大篇幅全面讨论了JVM上的多语言开发和项目控制,包括Groovy、Scala和Clojure这些优秀的新语言。这些技术可以帮助Java开发人员构建下一代商业软件。Java开发人员若要修炼进阶,本书绝对不容错过!
名人推荐:
我自认为是一名Java专家:用Java写了15年程序,发表了几百篇文章,在各种会议中演讲,还执教Java高级课程。可阅读Ben和Martijn的这本大作,经常能给我一些意料之外的启发。——Heinz Kabutz博士,知名Java技术教育家、The Java Specialists' Newsletter创始人
如果你想在Java专业领域占有一席之地,《Java程序员修炼之道》绝对值得拥有。
——Stephen Harrison,FirstFuel软件公司首席软件架构师
Java程序员修炼之道摘要:
这个新的收集策略让Java平台可以统计收集单个区域需用的平均时长。这样你就可以在合理范围内指定一个暂停目标。G1只会在有限的时间内收集尽可能多的区域(尽管在收集最后一个区域时所用的时间可能比预期的长)。要打开G1,需要用到表6—5中的选项。
这些选项可以组合,比如设置最大暂停目标是50ms,暂停间隔不能少于200ms。当然,GC系统所能承受的压力是有限的。必须有充足的暂停时间把垃圾取出来。每隔100年1ms的暂停目标肯定是不现实的。
G1可以支持的负载和应用类型范围很广。如果你的应用程序已经到了需要对GC调优的地步,G1会是一个不错的选择。
在下一节中,我们会介绍JIT编译。对于很多或大多数程序来说,这是唯一一个可以为产生高性能代码做出最大贡献的因素。我们会学习JIT编译的基础知识,最后解释一下如何打开JIT编译的日志,让你能够判断正在编译哪个方法。
6.6 HotSpot的JIT编译
正如我们在第1章所讲,Jav提一种“动态编译”语言。也就是说在程序运行时,其中的类还会再进行一次编译,然后转换成机器码。这个过程称为即时编译或JITing,并且通常是一次处理一个方法。要在庞大的代码库中找出其中的重要部分,理解这个过程是关键。
下面是一些与JIT编译有关的基本事实。
几乎所有现代JVM中都有某种JIT编译器。
相比较而言,纯粹解释型的VM要慢得多。
编译过的方法在运行速度上要比解释型的代码快很多,非常多。
先编译用得最多的方法,这是有道理的。
在做JIT编译时,先处理唾手可得的编译很重要。
按照最后一点,我们应该先研究编译过的代码,因为在正常情况下,所有仍然处于解释状态下的方法都没有已经编译过的方法运行频繁。偶尔会有无法编译的方法,但非常罕见。
方法一开始都是以字节码形态存在的,有调用时ⅣM只会对字节码进行解释并执行,同时记录方法被调用的次数及其他一些统计数据。当被调用次数达到某个阈值(默认10000次)后,如果它是合格的方法,就会有个JVM线程在后台把它的字节码编译成机器码。如果编译成功,以后所有对该方法的调用都会用它的编译结果,除非出现了某些导致检验失效的情况,或者出现了逆优化①。
根据实际情况,方法编译后产生的机器码运行速度可能比解释模式下的字节码快100倍。改善性能通常都要先弄明白程序中哪些方法比较重要,以及哪些重要的方法被编译了。
在接下来对JITing机制的讨论中,我们所说的JVM特指Hotspot。后续讨论中很多通用内容也适用于其他VM,但在具体细节上可能会有很大出入。
我们会先介绍一下Hotspot提供的几个JIT编译器,然后解释Hotspot中最有力的两项优化技术(内联和独占派发)。在本节的结尾,我们会告诉你如何打开方法编译日志,以便你可以看到被编译的确切方法。下面有请HotSpot。
免责声明:
Java程序员修炼之道来源于网络,仅用于分享知识,学习和交流!请下载完在24小时内删除。Java程序员修炼之道禁用于商业用途!如果您喜欢《Java程序员修炼之道》,请购买正版,谢谢合作。
爱学习,请到3322软件站 / 查找资源自行下载!
展开更多
Java程序员修炼之道pdf高清版下载地址
- 需先下载高速下载器:
- 专用下载:
- 其它下载: