登入帳戶  | 訂單查詢  | 購物車/收銀台(0) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入   新用戶註冊
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / 物流,時效:出貨後2-4日

2024年10月出版新書

2024年09月出版新書

2024年08月出版新書

2024年07月出版新書

2024年06月出版新書

2024年05月出版新書

2024年04月出版新書

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

『簡體書』JVM G1源码分析和调优

書城自編碼: 3337600
分類: 簡體書→大陸圖書→計算機/網絡程序設計
作者: 彭成寒
國際書號(ISBN): 9787111621973
出版社: 机械工业出版社
出版日期: 2019-04-01


書度/開本: 16开 釘裝: 平装

售價:NT$ 703

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
巨人传(插图珍藏本)
《 巨人传(插图珍藏本) 》

售價:NT$ 3289.0
地下(村上春树沙林毒气事件的长篇纪实)
《 地下(村上春树沙林毒气事件的长篇纪实) 》

售價:NT$ 332.0
偿还:债务与财富的阴暗面
《 偿还:债务与财富的阴暗面 》

售價:NT$ 347.0
清华大学藏战国竹简校释(壹):《命训》诸篇
《 清华大学藏战国竹简校释(壹):《命训》诸篇 》

售價:NT$ 408.0
封建社会农民战争问题导论(光启文库)
《 封建社会农民战争问题导论(光启文库) 》

售價:NT$ 296.0
虚弱的反攻:开禧北伐
《 虚弱的反攻:开禧北伐 》

售價:NT$ 429.0
泰山:一种中国信仰专论(法国汉学经典译丛)
《 泰山:一种中国信仰专论(法国汉学经典译丛) 》

售價:NT$ 380.0
花外集斠箋
《 花外集斠箋 》

售價:NT$ 704.0

內容簡介:
G1作为JVM中最新、*成熟的垃圾回收器,已经广泛应用在众多公司的生产环境中。本书详细介绍G1涉及的基本概念和运行原理,以及调优方法。主要内容共12章,主要内容有:第1~2章介绍垃圾回收的历史和应用的算法,以及基本概念。第3~7章从多方面分析G1的运行原理,如G1是如何分配对象的,G1的Refine线程、新生代回收、混合回收、FullGC等。第8章介绍垃圾回收过程中如何处理引用,第9章介绍G1引入的新特性:字符串去重,第10章介绍G1垃圾回收过程中线程如何达到安全点,第11章介绍如何选择垃圾回收器,第12章介绍了下一代垃圾回收器Shenandoah和ZGC。另外,为了降低学习难度,还给出了三个附录:附录A介绍如何开始阅读和调试JVM代码,附录B介绍如何使用NMT对JVM内存进行跟踪和调试,附录C介绍了Java程序员阅读JVM需要知道的一些C++知识。
目錄
前 言
第1章 垃圾回收概述1
1.1 Java发展概述1
1.2 本书常见术语4
1.3 回收算法概述6
1.3.1 分代管理算法7
1.3.2 复制算法7
1.3.3 标记清除8
1.3.4 标记压缩9
1.3.5 算法小结9
1.4 JVM垃圾回收器概述9
1.4.1 串行回收9
1.4.2 并行回收10
1.4.3 并发标记回收10
1.4.4 垃圾优先回收10
第2章 G1的基本概念14
2.1 分区14
2.2 G1停顿预测模型20
2.3 卡表和位图22
2.4 对象头24
2.5 内存分配和管理27
2.6 线程30
2.6.1 栈帧32
2.6.2 句柄34
2.6.3 JVM本地方法栈中的对象36
2.6.4 Java本地方法栈中的对象40
2.7 日志解读40
2.8 参数介绍和调优41
第3章 G1的对象分配43
3.1 对象分配概述43
3.2 快速分配46
3.3 慢速分配56
3.3.1 大对象分配58
3.3.2 最后的分配尝试60
3.4 G1垃圾回收的时机61
3.4.1 分配时发生回收61
3.4.2 外部调用的回收61
3.5 参数介绍和调优62
第4章 G1的Ref?ine线程64
4.1 记忆集64
4.2 Ref?ine线程的功能及原理72
4.2.1 抽样线程72
4.2.2 管理RSet74
4.2.3 Mutator处理DCQ78
4.2.4 Ref?ine线程的工作原理78
4.3 Ref?inement Zone85
4.4 RSet涉及的写屏障86
4.5 日志解读87
4.6 参数介绍和调优90
第5章 新生代回收93
5.1 YGC算法概述93
5.2 YGC代码分析96
5.2.1 并行任务96
5.2.2 其他处理115
5.3 YGC算法演示116
5.3.1 选择CSet117
5.3.2 根处理117
5.3.3 RSet处理118
5.3.4 复制119
5.3.5 Redirty120
5.3.6 释放空间120
5.4 日志解读121
5.4.1 YGC日志121
5.4.2 大对象日志分析125
5.4.3 对象年龄日志分析125
5.5 参数介绍和调优126
第6章 混合回收129
6.1 并发标记算法详解130
6.2 并发标记算法的难点133
6.2.1 三色标记法133
6.2.2 难点示意图133
6.2.3 再谈写屏障135
6.3 G1中混合回收的步骤141
6.4 混合回收中并发标记处理的线程145
6.4.1 并发标记线程启动的时机147
6.4.2 根扫描子阶段148
6.4.3 并发标记子阶段152
6.4.4 再标记子阶段159
6.4.5 清理子阶段160
6.4.6 启动混合收集167
6.5 并发标记算法演示170
6.5.1 初始标记子阶段171
6.5.2 根扫描子阶段171
6.5.3 并发标记子阶段171
6.5.4 再标记子阶段172
6.5.5 清理子阶段173
6.6 GC活动图174
6.7 日志解读174
6.8 参数优化178
第7章 Full GC181
7.1 Evac失败181
7.2 串行FGC187
7.2.1 标记活跃对象188
7.2.2 计算对象的新地址190
7.2.3 更新引用对象的地址190
7.2.4 移动对象完成压缩193
7.2.5 后处理194
7.3 并行FGC196
7.3.1 并行标记活跃对象197
7.3.2 计算对象的新地址198
7.3.3 更新引用对象的地址200
7.3.4 移动对象完成压缩200
7.3.5 后处理201
7.4 日志解读201
7.5 参数介绍和调优202
第8章 G1中的引用处理203
8.1 引用概述203
8.2 可回收对象发现207
8.3 在GC时的处理发现列表210
8.4 重新激活可达的引用214
8.5 日志解读215
8.6 参数介绍和调优215
第9章 G1的新特性:字符串去重217
9.1 字符串去重概述217
9.2 日志解读220
9.3 参数介绍和调优222
9.4 字符串去重和String.intern的区别222
9.5 String.intern中的实现223
第10章 线程中的安全点226
10.1 安全点的基本概念226
10.2 G1并发线程进入安全点227
10.3 解释线程进入安全点230
10.4 编译线程进入安全点230
10.5 正在执行本地代码的线程进入安全点233
10.6 安全点小结236
10.7 日志分析236
10.8 参数介绍和调优238
第11章 垃圾回收器的选择241
11.1 如何衡量垃圾回收器241
11.2 G1调优的方向243
第12章 新一代垃圾回收器247
12.1 Shenandoah247
12.2 ZGC258
附录A 编译调试JVM262
附录B 本地内存跟踪272
附录C 阅读JVM需要了解的C++知识276
內容試閱
G1是目前最成熟的垃圾回收器,已经广泛应用在众多公司的生产环境中。我们知道,CMS作为使用最为广泛的垃圾回收器,也有令人头疼的问题,即如何对其众多的参数进行正确的设置。G1的目标就是替代CMS,所以在设计之初就希望降低程序员的负担,减少人工的介入。但这并不意味着我们完全不需要了解G1的原理和参数调优。笔者在实际工作中遇到过一些因参数设置不正确而导致GC停顿时间过长的问题。但要正确设置参数并不容易,这里涉及两个方面:第一,需要对G1的原理熟悉,只有熟悉G1的原理才知道调优的方向;第二,能分析和解读G1运行的日志信息,根据日志信息找到G1运行过程中的异常信息,并推断哪些参数可以解决这些异常。
本书尝试从G1的原理出发,系统地介绍新生代回收、混合回收、Full GC、并发标记、Refine线程等内容;同时依托于jdk8u的源代码介绍Hotspot如何实现G1,通过对源代码的分析来了解G1提供了哪些参数、这些参数的具体意义;最后本书还设计了一些示例代码,给出了G1在运行这些示例代码时的日志,通过日志分析来尝试调整参数并达到性能优化,还分析了参数调整可能带来的负面影响。
乍听起来,G1非常复杂,应该会有很多的参数。实际上在JDK8的G1实现中,一共新增了93个参数,其中开发参数(develop)有41个,产品参数(product)有31个,诊断参数(diagnostic)有9个,实验参数(experimental)有12个。开发参数需要在调试版本中才能进行验证(本书只涉及个别参数),其余的三类参数都可以在发布版本中打开、验证和使用。本书除了几个用于验证的诊断参数外,覆盖了发布版本中涉及的所有参数,为读者理解G1以及调优G1提供了帮助。
本书共分为12章,主要内容如下:
第1章介绍垃圾回收的发展及使用的算法,同时还介绍一些重要并常见的术语。该章的知识不仅仅限于本书介绍的G1,对于研读JVM文章或者JVM源码都有帮助。
第2章介绍G1中的基本概念,包括分区、卡表、根集合、线程栈等和垃圾回收相关的基本知识点。
第3章介绍G1是如何分配对象的,包括TLAB和慢速分配,G1的对象分配和其他垃圾回收器的对象分配非常类似,只不过在分配的时候以分区为基础,除此之外没有额外的变化,所以该章知识不仅仅适用于G1也适用于其他垃圾回收器,最后介绍了参数调优,同样也适用于其他的垃圾回收器。
第4章介绍G1 Refine线程,包括G1如何管理和处理代际引用,从而加快垃圾回收速度,介绍了Refinement调优涉及的参数;虽然CMS也有卡表处理代际引用,但是G1的处理和CMS并不相同,Refine线程是G1新引入的部分。
第5章介绍新生代回收,包括G1如何进行新生代回收,包括对象标记、复制、分区释放等细节,还介绍了新生代调优涉及的参数。
第6章介绍混合回收。主要介绍G1的并发标记算法及其难点,以及G1中如何解决这个难点,同时介绍了并发标记的步骤:并发标记、Remark(再标记)和清理阶段;最后还介绍了并发标记的调优参数。
第7章介绍Full GC。在G1中,Full GC对整个堆进行垃圾回收,该章介绍G1的串行Full GC和JDK 10之后的并行Full GC算法。
第8章介绍垃圾回收过程中如何处理引用,该功能不是G1独有的,也适用于其他垃圾回收器。
第9章介绍G1的新特性:字符串去重。根据OpenJDK的官方文档,该特性可平均节约内存13%左右,所以这是一个非常有用的特性,值得大家尝试和使用。另外,该特性和JDK中String类的intern方法有一些类似的地方,所以该章还比较了它们之间的不同。
第10章介绍线程中的安全点。安全点在实际调优中涉及的并不多,所以很多人并不是特别熟悉。实际上,垃圾回收发生时,在进入安全点中做了不少的工作,而这些工作基本上是串行进行的,这些事情很有可能导致垃圾回收的时间过长。该章除了介绍如何进入安全点之外,还介绍了在安全点中做的一些回收工作,以及当发现它们导致GC过长时该如何调优。
第11章介绍如何选择垃圾回收器,以及选择G1遇到问题需要调优时我们该如何下手。该章属于理论性的指导,在实际工作中需要根据本书提到的参数正面影响和负面影响综合考虑,并不断调整。
第12章介绍了下一代垃圾回收器Shenandoah和ZGC。G1作为发挥重要作用的垃圾回收器仍有不足之处,因此未来的垃圾回收器仍会继续发展,该章介绍了下一代垃圾回收器Shenandoah和ZGC对G1的改进之处及其工作原理。
本书的附录包含如下内容:
附录A介绍如何开始阅读和调试JVM代码。这里简单介绍了G1的代码架构和组织形式。另外简单介绍了Linux的调试工具GDB,这个工具对于想要了解JVM细节的同学必不可少。
附录B介绍如何使用NMT对JVM内存进行跟踪和调试。这个知识对于想要深入理解JVM内存的管理非常有帮助,另外在实际工作中,特别是JDK升级中我们必须比较同一应用在不同JVM运行情况下的内存使用。
附录C介绍了Java程序员阅读JVM时需要知道的一些C++知识。这里并未罗列C++的语法以及语法特性,仅仅介绍一些C++语言特有的、而Java语言没有的语法,或者Java语言中的使用或理解不同于C++语言的部分语法。这个知识是为Java程序员准备的,特别是为在阅读JVM代码时准备的。
G1在JDK 6中出现,经历JDK 7的发展,到JDK 8已经相当成熟,在JDK 9之后G1就作为JVM的默认垃圾回收器。JDK 8作为Oracle公司长期支持的版本,本书主要基于JDK 8进行分析,所用的版本是jdk8u60。在第7章中为了扩展读者的视野,追踪最新的技术,还介绍了JDK 10中的并行Full GC。读者可以自行到OpenJDK的官网下载,也可以使用笔者在GitHub中的备份(JDK 8: https:github.comchenghanpengjdk8u60,JDK 10:https:github.comchenghanpengjdk10u)。
本书在分析源码的时候会给出源代码所属的文件,例如在介绍G1分区类型时,指出源代码位于hotspotsrcsharevmgc_implementationg1heapRegionType.hpp,这里的hotspot就是你下载的jdk8u60代码里面的一级目录。如果你不希望在本地保留源代码可以直接浏览网址https:github.comchenghanpengjdk8u60,在此你可以找到这个一级目录hotspot,然后通过逐个查看子目录src、share、vm、gc_implementation、g1就可以找到源文件heapRegionType.hpp。
需要注意的是,在分析源码的时候为了节约篇幅,通常会对原始的代码进行一些调整,例如删除一些大括号、统计信息、打印信息,或者删除一些不影响理解原理和算法的代码,大家在和源码比较时需要注意这些变化。另外对于定义在header文件和cpp文件中的一些函数,为了使代码紧凑,通常会忽略头文件中的定义,直接按照C++的语法,即类名::成员函数的方式给出源码,这样的代码可能和原文件不完全一致,但是完全符合C++语言的组织,阅读源码时要注意将定义和实现分开。
由于笔者水平有限,时间仓促,书中难免出现一些错误或者不准确的地方,恳请读者批评指正。可以通过https:github.comchenghanpengjdk8u60issues进行讨论,期待能够得到读者朋友们的真情反馈,在技术道路上互勉共进。
在本书的写作过程中,得到了很多朋友以及同事的帮助和支持,在此表示衷心的感谢!
感谢吴怡编辑的支持和鼓励,在写作过程中给出了非常多的意见和建议,不厌其烦地认真和笔者沟通,力争做到清晰、准确、无误。感谢你的耐心,为你的专业精神致敬!
感谢我的家人,特别是谢谢我的儿子,体谅爸爸牺牲了陪伴你的时间。有了你们的支持和帮助,我才有时间和精力去完成写作。

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 台灣用户 | 香港/海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.