
周志明,资深Java技术专家,对JavaEE企业级应用开发、OSGi、Java虚拟机和工作流等都有深入的研究,并在大量的实践中积累了丰富的经验。尤其精通Java虚拟机,撰写了大量与JVM相关的经典文章,被各大技术社区争相转载,是ITeye等技术社区公认的Java虚拟机方面的领袖人物之一。除本书外,还著有经典著作《深入理解OSGi:Equinox原理、应用与最佳实践》,广获读者好评。现任远光软件股份有限公司开发部总经理兼架构师,先后参与过国家电网、南方电网等多个国家级大型ERP项目的平台架构工作,对软件系统架构也有深刻的认识和体会。
《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》内容简介:第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK 1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干与生产环境相结合的实战案例;对第1版中的错误和不足之处的修正;等等。第2版不仅技术更新、内容更丰富,而且实战性更强。《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解书中后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果;第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。
前言第一部分走近Java第1章走近Java21.1概述21.2Java技术体系31.3Java发展史51.4Java虚拟机发展史91.4.1SunClassicExactVM91.4.2SunHotSpotVM111.4.3SunMobile—EmbeddedVMMeta—CircularVM121.4.4BEAJRockitIBMJ9VM131.4.5AzulVMBEALiquidVM141.4.6ApacheHarmonyGoogleAndroidDalvikVM141.4.7MicrosoftJVM及其他151.5展望Java技术的未来161.5.1模块化171.5.2混合语言171.5.3多核并行191.5.4进一步丰富语法201.5.564位虚拟机211.6实战:自己编译JDK221.6.1获取JDK源码221.6.2系统需求241.6.3构建编译环境251.6.4进行编译261.6.5在IDE工具中进行源码调试311.7本章小结35第二部分自动内存管理机制第2章Java内存区域与内存溢出异常382.1概述382.2运行时数据区域382.2.1程序计数器392.2.2Java虚拟机栈392.2.3本地方法栈402.2.4Java堆412.2.5方法区412.2.6运行时常量池422.2.7直接内存432.3HotSpot虚拟机对象探秘432.3.1对象的创建442.3.2对象的内存布局472.3.3对象的访问定位482.4实战:OutOfMemoryError异常502.4.1Java堆溢出512.4.2虚拟机栈和本地方法栈溢出532.4.3方法区和运行时常量池溢出562.4.4本机直接内存溢出592.5本章小结60第3章垃圾收集器与内存分配策略613.1概述613.2对象已死吗623.2.1引用计数算法623.2.2可达性分析算法643.2.3再谈引用653.2.4生存还是死亡663.2.5回收方法区683.3垃圾收集算法693.3.1标记—清除算法693.3.2复制算法703.3.3标记—整理算法713.3.4分代收集算法723.4HotSpot的算法实现723.4.1枚举根节点723.4.2安全点733.4.3安全区域743.5垃圾收集器753.5.1Serial收集器763.5.2ParNew收集器773.5.3ParallelScavenge收集器793.5.4SerialOld收集器803.5.5ParallelOld收集器803.5.6CMS收集器813.5.7G1收集器843.5.8理解GC日志893.5.9垃圾收集器参数总结903.6内存分配与回收策略913.6.1对象优先在Eden分配913.6.2大对象直接进入老年代933.6.3长期存活的对象将进入老年代953.6.4动态对象年龄判定973.6.5空间分配担保983.7本章小结100第4章虚拟机性能监控与故障处理工具1014.1概述1014.2JDK的命令行工具1014.2.1jps:虚拟机进程状况工具1044.2.2jstat:虚拟机统计信息监视工具1054.2.3jinfo:Java配置信息工具1064.2.4jmap:Java内存映像工具1074.2.5jhat:虚拟机堆转储快照分析工具1084.2.6jstack:Java堆栈跟踪工具1094.2.7HSDIS:JIT生成代码反汇编1114.3JDK的可视化工具1144.3.1JConsole:Java监视与管理控制台1154.3.2VisualVM:多合一故障处理工具1224.4本章小结131第5章调优案例分析与实战1325.1概述1325.2案例分析1325.2.1高性能硬件上的程序部署策略1325.2.2集群间同步导致的内存溢出1355.2.3堆外内存导致的溢出错误1365.2.4外部命令导致系统缓慢1375.2.5服务器JVM进程崩溃1385.2.6不恰当数据结构导致内存占用过大1395.2.7由Windows虚拟内存导致的长时间停顿1415.3实战:Eclipse运行速度调优1425.3.1调优前的程序运行状态1425.3.2升级JDK1.6的性能变化及兼容问题1455.3.3编译时间和类加载时间的优化1505.3.4调整内存设置控制垃圾收集频率1535.3.5选择收集器降低延迟1575.4本章小结160第三部分虚拟机执行子系统第6章类文件结构1626.1概述1626.2无关性的基石1626.3Class类文件的结构1646.3.1魔数与Class文件的版本1666.3.2常量池1676.3.3访问标志1736.3.4类索引、父类索引与接口索引集合1746.3.5字段表集合1756.3.6方法表集合1786.3.7属性表集合1806.4字节码指令简介1966.4.1字节码与数据类型1976.4.2加载和存储指令1996.4.3运算指令2006.4.4类型转换指令2026.4.5对象创建与访问指令2036.4.6操作数栈管理指令2036.4.7控制转移指令2046.4.8方法调用和返回指令2046.4.9异常处理指令2056.4.10同步指令2056.5公有设计和私有实现2066.6Class文件结构的发展2076.7本章小结208第7章虚拟机类加载机制2097.1概述2097.2类加载的时机2107.3类加载的过程2147.3.1加载2147.3.2验证2167.3.3准备2197.3.4解析2207.3.5初始化2257.4类加载器2277.4.1类与类加载器2287.4.2双亲委派模型2297.4.3破坏双亲委派模型2337.5本章小结235第8章虚拟机字节码执行引擎2368.1概述2368.2运行时栈帧结构2368.2.1局部变量表2388.2.2操作数栈2428.2.3动态连接2438.2.4方法返回地址2438.2.5附加信息2448.3方法调用2448.3.1解析2448.3.2分派2468.3.3动态类型语言支持2588.4基于栈的字节码解释执行引擎2698.4.1解释执行2698.4.2基于栈的指令集与基于寄存器的指令集2708.4.3基于栈的解释器执行过程2728.5本章小结275第9章类加载及执行子系统的案例与实战2769.1概述2769.2案例分析2769.2.1Tomcat:正统的类加载器架构2769.2.2OSGi:灵活的类加载器架构2799.2.3字节码生成技术与动态代理的实现2829.2.4Retrotranslator:跨越JDK版本2869.3实战:自己动手实现远程执行功能2899.3.1目标2909.3.2思路2909.3.3实现2919.3.4验证2989.4本章小结299第四部分程序编译与代码优化第10章早期(编译期)优化30210.1概述30210.2Javac编译器30310.2.1Javac的源码与调试30310.2.2解析与填充符号表30510.2.3注解处理器30710.2.4语义分析与字节码生成30710.3Java语法糖的味道31110.3.1泛型与类型擦除31110.3.2自动装箱、拆箱与遍历循环31510.3.3条件编译31710.4实战:插入式注解处理器31810.4.1实战目标31810.4.2代码实现31910.4.3运行与测试32610.4.4其他应用案例32710.5本章小结328第11章晚期(运行期)优化32911.1概述32911.2HotSpot虚拟机内的即时编译器32911.2.1解释器与编译器33011.2.2编译对象与触发条件33211.2.3编译过程33711.2.4查看及分析即时编译结果33911.3编译优化技术34511.3.1优化技术概览34611.3.2公共子表达式消除35011.3.3数组边界检查消除35111.3.4方法内联35211.3.5逃逸分析35411.4Java与C/C++的编译器对比35611.5本章小结358第五部分高效并发第12章Java内存模型与线程36012.1概述36012.2硬件的效率与一致性36112.3Java内存模型36212.3.1主内存与工作内存36312.3.2内存间交互操作36412.3.3对于volatile型变量的特殊规则36612.3.4对于long和double型变量的特殊规则37212.3.5原子性、可见性与有序性37312.3.6先行发生原则37512.4Java与线程37812.4.1线程的实现37812.4.2Java线程调度38112.4.3状态转换38312.5本章小结384第13章线程安全与锁优化38513.1概述38513.2线程安全38513.2.1Java语言中的线程安全38613.2.2线程安全的实现方法39013.3锁优化39713.3.1自旋锁与自适应自旋39813.3.2锁消除39813.3.3锁粗化40013.3.4轻量级锁40013.3.5偏向锁40213.4本章小结403附录附录A编译Windows版的OpenJDK406附录B虚拟机字节码指令表414附录CHotSpot虚拟机主要参数表420附录D对象查询语言(OQL)简介424附录EJDK历史版本轨迹430
评论关闭。