深入理解Java虚拟机:JVM高级特性与最佳实践

深入理解Java虚拟机:JVM高级特性与最佳实践

第2版

9.01854 评价豆瓣读书
免费试读
¥25.00¥23.99
今日特价截止至:2021-11-30 02:00:00了解详情

作品简介

《深入理解Java虚拟机:JVM高级特性与最佳实践》第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK 1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干与生产环境相结合的实战案例;对第1版中的错误和不足之处的修正;等等。第2版不仅技术更新、内容更丰富,而且实战性更强。

《深入理解Java虚拟机:JVM高级特性与最佳实践》共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果;第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。

周志明:资深Java技术专家,对JavaEE企业级应用开发、OSGi、Java虚拟机和工作流等都有深入的研究,并在大量的实践中积累了丰富的经验。尤其精通Java虚拟机,撰写了大量与JVM相关的经典文章,被各大技术社区争相转载,是ITeye等技术社区公认的Java虚拟机方面的领袖人物之一。除本书外,还著有经典著作《深入理解OSGi:Equinox原理、应用与最佳实践》,广获读者好评。现任远光软件股份有限公司开发部总经理兼架构师,先后参与过国家电网、南方电网等多个国家级大型ERP项目的平台架构工作,对软件系统架构也有深刻的认识和体会。

作品目录

  1. 前言
  2. 第2版与第1版的区别
  3. 本书面向的读者
  4. 如何阅读本书
  5. 勘误和支持
  6. 致谢
  7. 第一部分 走近Java
  8. 第1章 走近Java
  9. 1.1 概述
  10. 1.2 Java技术体系
  11. 1.3 Java发展史
  12. 1.4 Java虚拟机发展史
  13. 1.5 展望Java技术的未来
  14. 1.6 实战:自己编译JDK
  15. 1.7 本章小结
  16. 第二部分 自动内存管理机制
  17. 第2章 Java内存区域与内存溢出异常
  18. 2.1 概述
  19. 2.2 运行时数据区域
  20. 2.3 HotSpot虚拟机对象探秘
  21. 2.4 实战:OutOfMemoryError异常
  22. 2.5 本章小结
  23. 第3章 垃圾收集器与内存分配策略
  24. 3.1 概述
  25. 3.2 对象已死吗
  26. 3.3 垃圾收集算法
  27. 3.4 HotSpot的算法实现
  28. 3.5 垃圾收集器
  29. 3.6 内存分配与回收策略
  30. 3.7 本章小结
  31. 第4章 虚拟机性能监控与故障处理工具
  32. 4.1 概述
  33. 4.2 JDK的命令行工具
  34. 4.3 JDK的可视化工具
  35. 4.4 本章小结
  36. 第5章 调优案例分析与实战
  37. 5.1 概述
  38. 5.2 案例分析
  39. 5.3 实战:Eclipse运行速度调优
  40. 5.4 本章小结
  41. 第三部分 虚拟机执行子系统
  42. 第6章 类文件结构
  43. 6.1 概述
  44. 6.2 无关性的基石
  45. 6.3 Class类文件的结构
  46. 6.4 字节码指令简介
  47. 6.5 公有设计和私有实现
  48. 6.6 Class文件结构的发展
  49. 6.7 本章小结
  50. 第7章 虚拟机类加载机制
  51. 7.1 概述
  52. 7.2 类加载的时机
  53. 7.3 类加载的过程
  54. 7.4 类加载器
  55. 7.5 本章小结
  56. 第8章 虚拟机字节码执行引擎
  57. 8.1 概述
  58. 8.2 运行时栈帧结构
  59. 8.3 方法调用
  60. 8.4 基于栈的字节码解释执行引擎
  61. 8.5 本章小结
  62. 第9章 类加载及执行子系统的案例与实战
  63. 9.1 概述
  64. 9.2 案例分析
  65. 9.3 实战:自己动手实现远程执行功能
  66. 9.4 本章小结
  67. 第四部分 程序编译与代码优化
  68. 第10章 早期(编译期)优化
  69. 10.1 概述
  70. 10.2 Javac编译器
  71. 10.3 Java语法糖的味道
  72. 10.4 实战:插入式注解处理器
  73. 10.5 本章小结
  74. 第11章 晚期(运行期)优化
  75. 11.1 概述
  76. 11.2 HotSpot虚拟机内的即时编译器
  77. 11.3 编译优化技术
  78. 11.4 Java与C/C++的编译器对比
  79. 11.5 本章小结
  80. 第五部分 高效并发
  81. 第12章 Java内存模型与线程
  82. 12.1 概述
  83. 12.2 硬件的效率与一致性
  84. 12.3 Java内存模型
  85. 12.4 Java与线程
  86. 12.5 本章小结
  87. 第13章 线程安全与锁优化
  88. 13.1 概述
  89. 13.2 线程安全
  90. 13.3 锁优化
  91. 13.4 本章小结
  92. 附录
  93. 附录A 编译Windows版的OpenJDK
  94. 附录B 虚拟机字节码指令表
  95. 附录C HotSpot虚拟机主要参数表
  96. 附录D 对象查询语言(OQL)简介
  97. 附录E JDK历史版本轨迹
载入中

热门划线

  1. 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。32 人
  2. 运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。30 人
  3. 每条线程都需要有一个独立的程序计数器20 人
  4. 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。20 人
  5. 安全区域是指在一段代码片段之中,引用关系不会发生变化。在这个区域中的任意地方开始GC都是安全的。我们也可以把Safe Region看做是被扩展了的Safepoint。18 人
  6. 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。加载该类的ClassLoader已经被回收。该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。16 人
  7. 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程16 人
  8. 虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。15 人
  9. 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。14 人
  10. 所有的对象实例以及数组都要在堆上分配13 人
  11. 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程13 人
  12. 类需要同时满足下面3个条件才能算是“无用的类”:该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。加载该类的ClassLoader已经被回收。该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。13 人
  13. 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器12 人
  14. 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。12 人
  15. 空闲列表12 人
  16. 在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出。12 人
  17. Java使用的线程调度方式就是抢占式调度12 人
  18. 指针碰撞11 人
  19. 对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。11 人
  20. 虚拟机栈(栈帧中的本地变量表)中引用的对象。方法区中类静态属性引用的对象。方法区中常量引用的对象。本地方法栈中JNI(即一般说的Native方法)引用的对象。11 人
  21. 准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配11 人
  22. 对象引用10 人
  23. 运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法。10 人
  24. 在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。10 人
  25. 为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知10 人
  26. 永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类10 人
  27. 废弃常量和无用的类10 人
  28. 如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。10 人
  29. 无符号数和表10 人
  30. 初始化阶段是执行类构造器<clinit>()方法的过程10 人
  31. 扩展类加载器(Extension ClassLoader)10 人
  32. 双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。10 人
  33. 如果对一个变量执行lock操作,那将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始化变量的值。10 人
  34. 局部变量表所需的内存空间在编译期间完成分配9 人
  35. 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常9 人
  36. Java堆是被所有线程共享的一块内存区域9 人
  37. 如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。9 人
  38. 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。9 人
  39. 在Java语言中,可作为GC Roots的对象包括下面几种:虚拟机栈(栈帧中的本地变量表)中引用的对象。方法区中类静态属性引用的对象。方法区中常量引用的对象。本地方法栈中JNI(即一般说的Native方法)引用的对象。9 人
  40. 安全点的选定基本上是以程序“是否具有让程序长时间执行的特征”为标准进行选定的9 人
  41. 每个Class文件的头4个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件9 人
  42. 应用程序类加载器(Application ClassLoader)9 人
  43. 使用volatile变量的第二个语义是禁止指令重排序优化9 人
  44. 大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。8 人
  45. 常量池中每一项常量都是一个表8 人

喜欢「深入理解Java虚拟机:JVM高级特性与最佳实践」的人也喜欢