您的位置:

深入理解java虚拟机第三章(关于java虚拟机,描述错误的是)

本文目录一览:

深入理解java虚拟机第二版和第三版的区别?

区别:

第三版是一款针对java学习打造的图书,它从Java程序员的角度出发,系统地将Java程序运行过程中涉及的各种知识整合到了一起,而第二版不仅技术更新、内容更丰富,而且实战性更强。

【第二版】

《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。

第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解书中后面内容有重要帮助。

第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。

第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。

第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果;

第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。

【第三版】

深入理解java虚拟机第三版pdf是一款针对java学习打造的图书,它从Java程序员的角度出发,系统地将Java程序运行过程中涉及的各种知识整合到了一起,并配以日常工作中可能会碰到的疑难案例,引领读者轻松踏上探索Java虚拟机的旅途。

《深入理解Java虚拟机(第2版)JVM高级特性与最佳实践》epub下载在线阅读,求百度网盘云资源

《深入理解Java虚拟机(第2版)》(周志明)电子书网盘下载免费在线阅读

资源链接:

链接:

密码:0xhz  

书名:深入理解Java虚拟机(第2版)

作者:周志明

豆瓣评分:9.0

出版社:机械工业出版社

出版年份:2013-9-1

页数:433

内容简介:

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

什么是Java虚拟机?

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。

Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

这种解释应该算是正确的,但是只描述了虚拟机的外部行为和功能,并没有针对内部原理做出说明。一般情况下我们不需要知道虚拟机的运行原理,只要专注写java代码就可以了,这也正是虚拟机之所以存在的原因--屏蔽底层操作系统平台的不同并且减少基于原生语言开发的复杂性,使java这门语言能够跨各种平台(只要虚拟机厂商在特定平台上实现了虚拟机),并且简单易用。这些都是虚拟机的外部特性,但是从这些信息来解释虚拟机,未免太笼统了,无法让我们知道内部原理。

从进程的角度解释JVM

让我们尝试从操作系统的层面来理解虚拟机。我们知道,虚拟机是运行在操作系统之中的,那么什么东西才能在操作系统中运行呢?当然是进程,因为进程是操作系统中的执行单位。可以这样理解,当它在运行的时候,它就是一个操作系统中的进程实例,当它没有在运行时(作为可执行文件存放于文件系统中),可以把它叫做程序。

对命令行比较熟悉的同学,都知道其实一个命令对应一个可执行的二进制文件,当敲下这个命令并且回车后,就会创建一个进程,加载对应的可执行文件到进程的地址空间中,并且执行其中的指令。下面对比C语言和Java语言的HelloWorld程序来说明问题。

首先编写C语言版的HelloWorld程序。

编译C语言版的HelloWorld程序:

gcc HelloWorld.c -o HelloWorld

运行C语言版的HelloWorld程序:

zhangjg@linux:/deve/workspace/HelloWorld/src$ ./HelloWorld

hello world

gcc编译器编译后的文件直接就是可被操作系统识别的二进制可执行文件,当我们在命令行中敲下 ./HelloWorld这条命令的时候, 直接创建一个进程, 并且将可执行文件加载到进程的地址空间中, 执行文件中的指令。

作为对比, 我们看一下Java版HelloWord程序的编译和执行形式。

首先编写源文件HelloWord.java :

编译Java版的HelloWorld程序:

运行Java版的HelloWorld程序:

zhangjg@linux:/deve/workspace/HelloJava/src$ java -classpath . HelloWorld

HelloWorld

从上面的过程可以看到, 我们在运行Java版的HelloWorld程序的时候, 敲入的命令并不是 ./HelloWorld.class 。 因为class文件并不是可以直接被操作系统识别的二进制可执行文件 。 我们敲入的是java这个命令。 这个命令说明, 我们首先启动的是一个叫做java的程序, 这个java程序在运行起来之后就是一个JVM进程实例。

上面的命令执行流程是这样的:

java命令首先启动虚拟机进程,虚拟机进程成功启动后,读取参数“HelloWorld”,把他作为初始类加载到内存,对这个类进行初始化和动态链接(关于类的初始化和动态链接会在后面的博客中介绍),然后从这个类的main方法开始执行。也就是说我们的.class文件不是直接被系统加载后直接在cpu上执行的,而是被一个叫做虚拟机的进程托管的。首先必须虚拟机进程启动就绪,然后由虚拟机中的类加载器加载必要的class文件,包括jdk中的基础类(如String和Object等),然后由虚拟机进程解释class字节码指令,把这些字节码指令翻译成本机cpu能够识别的指令,才能在cpu上运行。

从这个层面上来看,在执行一个所谓的java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程,而不是我们写的一个个的class文件。这个叫做虚拟机的进程处理一些底层的操作,比如内存的分配和释放等等。我们编写的class文件只是虚拟机进程执行时需要的“原料”。这些“原料”在运行时被加载到虚拟机中,被虚拟机解释执行,以控制虚拟机实现我们java代码中所定义的一些相对高层的操作,比如创建一个文件等,可以将class文件中的信息看做对虚拟机的控制信息,也就是一种虚拟指令。

编程语言也有自己的原理, 学习一门语言, 主要是把它的原理搞明白。 看似一个简单的HelloWorld程序, 也有很多深入的内容值得剖析。

JVM体系结构简介

为了展示虚拟机进程和class文件的关系,特意画了下面一张图:

根据上图表达的内容,我们编译之后的class文件是作为Java虚拟机的原料被输入到Java虚拟机的内部的,那么具体由谁来做这一部分工作呢?其实在Java虚拟机内部,有一个叫做类加载器的子系统,这个子系统用来在运行时根据需要加载类。注意上面一句话中的“根据需要”四个字。在Java虚拟机执行过程中,只有他需要一个类的时候,才会调用类加载器来加载这个类,并不会在开始运行时加载所有的类。就像一个人,只有饿的时候才去吃饭,而不是一次把一年的饭都吃到肚子里。一般来说,虚拟机加载类的时机,在第一次使用一个新的类的时候。本专栏后面的文章会具体讨论Java中的类加载器。

由虚拟机加载的类,被加载到Java虚拟机内存中之后,虚拟机会读取并执行它里面存在的字节码指令。虚拟机中执行字节码指令的部分叫做执行引擎。就像一个人,不是把饭吃下去就完事了,还要进行消化,执行引擎就相当于人的肠胃系统。在执行的过程中还会把各个class文件动态的连接起来。关于执行引擎的具体行为和动态链接相关的内容也会在本专栏后续的文章中进行讨论。

我们知道,Java虚拟机会进行自动内存管理。具体说来就是自动释放没有用的对象,而不需要程序员编写代码来释放分配的内存。这部分工作由垃圾收集子系统负责。

从上面的论述可以知道, 一个Java虚拟机实例在运行过程中有三个子系统来保障它的正常运行,分别是类加载器子系统, 执行引擎子系统和垃圾收集子系统。 如下图所示:

虚拟机的运行,必须加载class文件,并且执行class文件中的字节码指令。它做这么多事情,必须需要自己的空间。就像人吃下去的东西首先要放在胃中。虚拟机也需要空间来存放个中数据。首先,加载的字节码,需要一个单独的内存空间来存放;一个线程的执行,也需要内存空间来维护方法的调用关系,存放方法中的数据和中间计算结果;在执行的过程中,无法避免的要创建对象,创建的对象需要一个专门的内存空间来存放。关于虚拟机运行时数据区的内容,也会出现在本专栏后续的文章中。虚拟机的运行时内存区大概可以分成下图所示的几个部分。(这里只是大概划分,并没有划分的很精细)

总结

写到这里,基本上关于我对java虚拟机的理解就写完了。这篇文章的主题虽然是深入理解Java虚拟机,但是你可能感觉一点也不“深入”,也只是泛泛而谈。我也有这样的感觉。限于自己水平有限,也只能这样了,要是想深入理解java虚拟机,强烈建议读一下三本书:

《深入Java虚拟机》

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

《Java虚拟机规范》

其实我也读过这几本书,但是它们对虚拟机的解释也是基于一个外部模型,而没有深入剖析虚拟机内部的实现原理。虚拟机是一个大而复杂的东西,实现虚拟机的人都是大牛级别的,如果不是参与过虚拟机的实现,应该很少有人能把它参透。本专栏后面的一些文章也参考了这三本书, 虽然讲解Java语法的书不计其数, 但是深入讲解虚拟机的书, 目前为止我就见过这三本,并且网上的资料也不是很多。

最后做一个总结:

1 虚拟机并不神秘,在操作系统的角度看来,它只是一个普通进程。

2 这个叫做虚拟机的进程比较特殊,它能够加载我们编写的class文件。如果把JVM比作一个人,那么class文件就是我们吃的食物。

3 加载class文件的是一个叫做类加载器的子系统。就好比我们的嘴巴,把食物吃到肚子里。

4 虚拟机中的执行引擎用来执行class文件中的字节码指令。就好比我们的肠胃,对吃进去的食物进行消化。

5 虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。清理对象回收内存的任务由垃圾收集器负责。就好比人吃进去的食物,在消化之后,必须把废物排出体外,腾出空间可以在下次饿的时候吃饭并消化食物。

扩展资料:

关于JAVA虚拟机的参数说明如下:

1、运行class文件

执行带main方法的class文件,Java虚拟机[3] 命令参数行为:

java CLASS文件名

注意:CLASS文件名不要带文件后缀.class

例如:

java Test

如果执行的class文件是带包的,即在类文件中使用了:

package ;包名

那应该在包的基路径下执行,Java虚拟机命令行参数:

java ;包名.CLASS文件名

例如:

PackageTest.java中,其包名为:com.ee2ee.test,对应的语句为:

package com.ee2ee.test;

PackageTest.java及编译后的class文件PackageTest.class的存放目录如下:

classes

|__com

|__ee2ee

|__test

|__PackageTest.java

|__PackageTest.class

要运行PackageTest.class,应在classes目录下执行:

java com.ee2ee.test.PackageTest

2、运行jar文件中的class

原理和运行class文件一样,只需加上参数-cp jar文件名;即可。

例如:执行test.jar中的类com.ee2ee.test.PackageTest,命令行如下:

java -cp test.jar com.ee2ee.test.PackageTest

3、显示JDK版本信息

当一台机器上有多个jdk版本时,需要知道当前使用的是那个版本的jdk,使用参数-version即可知道其版本,命令行为:

java -version

4、增加虚拟机可以使用的最大内存

Java虚拟机可使用的最大内存是有限制的,缺省值通常为64MB或128MB。

如果一个应用程序为了提高性能而把数据加载内存中而占用较大的内存,比如超过了默认的最大值128MB,需要加大java虚拟机可使用的最大内存,否则会出现Out of Memory的异常。启动java时,需要使用如下两个参数:

-Xms java虚拟机初始化时使用的内存大小

-Xmx java虚拟机可以使用的最大内存

以上两个命令行参数中设置的size,可以带单位,例如:256m表示256MB

举例说明:

java -Xms128m -Xmx256m ...

表示Java虚拟机初始化时使用的内存为128MB,可使用的最大内存为256MB。

对于tomcat,可以修改其脚本catalina. sh(Unix平台)或catalina.bat(Windows平台),设置变量JAVA_OPTS即可,例如:

JAVA_OPTS='-Xms128m -Xmx256m'

参考资料:百度百科-java虚拟机

深入理解Java虚拟机的目录

前言

致谢

第一部分 走近Java

第1章 走近Java / 2

1.1 概述 / 2

1.2 Java技术体系 / 3

1.3 Java发展史 / 5

1.4 展望Java技术的未来 / 9

1.4.1 模块化 / 9

1.4.2 混合语言 / 9

1.4.3 多核并行 / 11

1.4.4 进一步丰富语法 / 12

1.4.5 64位虚拟机 / 13

1.5 实战:自己编译JDK / 13

1.5.1 获取JDK源码 / 13

1.5.2 系统需求 / 14

1.5.3 构建编译环境 / 15

1.5.4 准备依赖项 / 17

1.5.5 进行编译 / 18

1.6 本章小结 / 21

第二部分 自动内存管理机制

第2章 Java内存区域与内存溢出异常 / 24

2.1 概述 / 24

2.2 运行时数据区域 / 25

2.2.1 程序计数器 / 25

2.2.2 Java虚拟机栈 / 26

2.2.3 本地方法栈 / 27

2.2.4 Java堆 / 27

2.2.5 方法区 / 28

2.2.6 运行时常量池 / 29

2.2.7 直接内存 / 29

2.3 对象访问 / 30

2.4 实战:OutOfMemoryError异常 / 32

2.4.1 Java堆溢出 / 32

2.4.2 虚拟机栈和本地方法栈溢出 / 35

2.4.3 运行时常量池溢出 / 38

2.4.4 方法区溢出 / 39

2.4.5 本机直接内存溢出 / 41

2.5 本章小结 / 42

第3章 垃圾收集器与内存分配策略 / 43

3.1 概述 / 43

3.2 对象已死? / 44

3.2.1 引用计数算法 / 44

3.2.2 根搜索算法 / 46

3.2.3 再谈引用 / 47

3.2.4 生存还是死亡? / 48

3.2.5 回收方法区 / 50

3.3 垃圾收集算法 / 51

3.3.1 标记 -清除算法 / 51

3.3.2 复制算法 / 52

3.3.3 标记-整理算法 / 54

3.3.4 分代收集算法 / 54

3.4 垃圾收集器 / 55

3.4.1 Serial收集器 / 56

3.4.2 ParNew收集器 / 57

3.4.3 Parallel Scavenge收集器 / 59

3.4.4 Serial Old收集器 / 60

3.4.5 Parallel Old收集器 / 61

3.4.6 CMS收集器 / 61

3.4.7 G1收集器 / 64

3.4.8 垃圾收集器参数总结 / 64

3.5 内存分配与回收策略 / 65

3.5.1 对象优先在Eden分配 / 66

3.5.2 大对象直接进入老年代 / 68

3.5.3 长期存活的对象将进入老年代 / 69

3.5.4 动态对象年龄判定 / 71

3.5.5 空间分配担保 / 73

3.6 本章小结 / 75

第4章 虚拟机性能监控与故障处理工具 / 76

4.1 概述 / 76

4.2 JDK的命令行工具 / 76

4.2.1 jps:虚拟机进程状况工具 / 79

4.2.2 jstat:虚拟机统计信息监视工具 / 80

4.2.3 jinfo:Java配置信息工具 / 82

4.2.4 jmap:Java内存映像工具 / 82

4.2.5 jhat:虚拟机堆转储快照分析工具 / 84

4.2.6 jstack:Java堆栈跟踪工具 / 85

4.3 JDK的可视化工具 / 87

4.3.1 JConsole:Java监视与管理控制台 / 88

4.3.2 VisualVM:多合一故障处理工具 / 96

4.4 本章小结 / 105

第5章 调优案例分析与实战 / 106

5.1 概述 / 106

5.2 案例分析 / 106

5.2.1 高性能硬件上的程序部署策略 / 106

5.2.2 集群间同步导致的内存溢出 / 109

5.2.3 堆外内存导致的溢出错误 / 110

5.2.4 外部命令导致系统缓慢 / 112

5.2.5 服务器JVM进程崩溃 / 113

5.3 实战:Eclipse运行速度调优 / 114

5.3.1 调优前的程序运行状态 / 114

5.3.2 升级JDK 1.6的性能变化及兼容问题 / 117

5.3.3 编译时间和类加载时间的优化 / 122

5.3.4 调整内存设置控制垃圾收集频率 / 126

5.3.5 选择收集器降低延迟 / 130

5.4 本章小结 / 133

第三部分 虚拟机执行子系统

第6章 类文件结构 / 136

6.1 概述 / 136

6.2 无关性的基石 / 136

6.3 Class类文件的结构 / 138

6.3.1 魔数与Class文件的版本 / 139

6.3.2 常量池 / 141

6.3.3 访问标志 / 147

6.3.4 类索引、父类索引与接口索引集合 / 148

6.3.5 字段表集合 / 149

6.3.6 方法表集合 / 153

6.3.7 属性表集合 / 155

6.4 Class文件结构的发展 / 168

6.5 本章小结 / 170

第7章 虚拟机类加载机制 / 171

7.1 概述 / 171

7.2 类加载的时机 / 172

7.3 类加载的过程 / 176

7.3.1 加载 / 176

7.3.2 验证 / 178

7.3.3 准备 / 181

7.3.4 解析 / 182

7.3.5 初始化 / 186

7.4 类加载器 / 189

7.4.1 类与类加载器 / 189

7.4.2 双亲委派模型 / 191

7.4.3 破坏双亲委派模型 / 194

7.5 本章小结 / 197

第8章 虚拟机字节码执行引擎 / 198

8.1 概述 / 198

8.2 运行时栈帧结构 / 199

8.2.1 局部变量表 / 199

8.2.2 操作数栈 / 204

8.2.3 动态连接 / 206

8.2.4 方法返回地址 / 206

8.2.5 附加信息 / 207

8.3 方法调用 / 207

8.3.1 解析 / 207

8.3.2 分派 / 209

8.4 基于栈的字节码解释执行引擎 / 221

8.4.1 解释执行 / 221

8.4.2 基于栈的指令集与基于寄存器的指令集 / 223

8.4.3 基于栈的解释器执行过程 / 224

8.5 本章小结 / 230

第9章 类加载及执行子系统的案例与实战 / 231

9.1 概述 / 231

9.2 案例分析 / 231

9.2.1 Tomcat:正统的类加载器架构 / 232

9.2.2 OSGi:灵活的类加载器架构 / 235

9.2.3 字节码生成技术与动态代理的实现 / 238

9.2.4 Retrotranslator:跨越JDK版本 / 242

9.3 实战:自己动手实现远程执行功能 / 246

9.3.1 目标 / 246

9.3.2 思路 / 247

9.3.3 实现 / 248

9.3.4 验证 / 255

9.4 本章小结 / 256

第四部分 程序编译与代码优化

第10章 早期(编译期)优化 / 258

10.1 概述 / 258

10.2 Javac编译器 / 259

10.2.1 Javac的源码与调试 / 259

10.2.2 解析与填充符号表 / 262

10.2.3 注解处理器 / 264

10.2.4 语义分析与字节码生成 / 264

10.3 Java语法糖的味道 / 268

10.3.1 泛型与类型擦除 / 268

10.3.2 自动装箱、拆箱与遍历循环 / 273

10.3.3 条件编译 / 275

10.4 实战:插入式注解处理器 / 276

10.4.1 实战目标 / 276

10.4.2 代码实现 / 277

10.4.3 运行与测试 / 284

10.4.4 其他应用案例 / 286

10.5 本章小结 / 286

第11章 晚期(运行期)优化 / 287

11.1 概述 / 287

11.2 HotSpot虚拟机内的即时编译器 / 288

11.2.1 解释器与编译器 / 288

11.2.2 编译对象与触发条件 / 291

11.2.3 编译过程 / 294

11.2.4 查看与分析即时编译结果 / 297

11.3 编译优化技术 / 301

11.3.1 优化技术概览 / 301

11.3.2 公共子表达式消除 / 305

11.3.3 数组边界检查消除 / 307

11.3.4 方法内联 / 307

11.3.5 逃逸分析 / 309

11.4 Java与C/C++的编译器对比 / 311

11.5 本章小结 / 313

第五部分 高效并发

第12章 Java内存模型与线程 / 316

12.1 概述 / 316

12.2 硬件的效率与一致性 / 317

12.3 Java内存模型 / 318

12.3.1 主内存与工作内存 / 319

12.3.2 内存间交互操作 / 320

12.3.3 对于volatile型变量的特殊规则 / 322

12.3.4 对于long和double型变量的特殊规则 / 327

12.3.5 原子性、可见性与有序性 / 328

12.3.6 先行发生原则 / 330

12.4 Java与线程 / 333

12.4.1 线程的实现 / 333

12.4.2 Java线程调度 / 337

12.4.3 状态转换 / 339

12.5 本章小结 / 341

第13章 线程安全与锁优化 / 342

13.1 概述 / 342

13.2 线程安全 / 343

13.2.1 Java语言中的线程安全 / 343

13.2.2 线程安全的实现方法 / 348

13.3 锁优化 / 356

13.3.1 自旋锁与自适应自旋 / 356

13.3.2 锁消除 / 357

13.3.3 锁粗化 / 358

13.3.4 轻量级锁 / 358

13.3.5 偏向锁 / 361

13.4 本章小结 / 362

附录A Java虚拟机家族 / 363

附录B 虚拟机字节码指令表 / 366

附录C HotSpot虚拟机主要参数表 / 372

附录D 对象查询语言(OQL)简介 / 376

附录E JDK历史版本轨迹 / 383

谁有《深入理解Java虚拟机:JVM高级特性与最佳实践-周志明》电子书百度网盘资源下载

《深入理解Java虚拟机:JVM高级特性与最佳实践-周志明》电子书百度网盘资源下载:

链接:

提取码: kpf4    

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