深入理解Java虚拟机第二版学习笔记(一)

深入理解Java虚拟机第二版学习笔记。

第一章,       走进Java

1.2 Java技术体系

Sun官方定义的Java技术体系包括以下几个组成部分:

Java程序设计语言;

各种硬件平台上的Java虚拟机;

Class文件格式;

Java API类库;

来自商业机构和开源社区的第三方Java类库。

 

通常把Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK(Java Development Kit)jdk是支持Java程序开发的最小环境。

可以把Java API类库中Java SE API子集和Java虚拟机这两部分统称为JRE(Java RuntimeEnvironment)jre是支持Java程序运行的标准环境。

       下图是Java技术体系包含的内容,及JDK,JRE的范围

 

 

上面是根据组成部分的功能进行划分。

 

按技术服务的领域,或者按Java技术关注的重点业务领域划分,Java技术体系分为4个平台:

Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。

Java ME(Micro Edition):支持Java程序运行在移动终端(手机,PDA)上的平台,对JavaAPI有所精简,加入了针对移动终端的支持。

JavaSE(Standard Edition):支持面向桌面级应用的Java平台。

JavaEE(Enterprise Edition):支持使用多层架构的企业应用的Java平台,除了提供java se api外,还对其多了扩充,这些扩充一半以javax.*作为包名,java se api的核心包通常是java.*做包名。

 

1.4 Java虚拟机发展史

1.4.1 Sun Classic VM,是Sun公司发布JDK1.0中包含的虚拟机。

这款虚拟机只能用纯解释器方式来执行Java代码,如果要使用JIT编译器,就要外挂,而且使用外挂JIT编译器后,JIT就完全接管了虚拟机的执行系统,解释器就不工作了。

由于编译器和解释器不能配合工作,意味着如果要使用编译器执行,编译器就要对每一个方法、每一行代码都进行编译,而不管他们执行的效率是否具有编译的价值。这些编译器不敢应用编译耗时稍高的优化技术,因为会影响程序的响应时间。所以这个时期Java很慢的形象就树立了。

 

Jdk1.2时,发不过一款ExactVM虚拟机,它具备了编译器和解释器混合工作的模式。Exact VMExact Memory Management)准确式内存管理VM,就是虚拟机可以知道内存中某个位置的数据具体是什么类型。如内存中有个32位的整数123456,它是一个reference类型指向123456的内存地址?还是一个数据值是123456的整数,ExactVM可以分辨出来,这样在GC时能准确判断堆上的数据是否还可能被引用。

 

1.4.2 Sun HotSpot VMjdk1.3之后,HotSpot VM作为默认虚拟机。

HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。如果一个方法被频繁调用,或者方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。通过编译器和解释器协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,有助于引入更多的代码优化技术,输出跟高质量的本地代码。

 

1.5 Java技术发展点。

1.5.1 模块化

       模块化是解决应用系统和技术平台越来越复杂、越来越庞大问题的一个重要途径。站在软件工业化的高度看,模块化是建立各种功能的标准件的前提。Osgi技术。

1.5.2混合语言

       有越来越多的基于Java虚拟机的语言开发被应用到软件项目中。Java平台的多语言混合编程正成为主流,每种语言都可以针对自己擅长的方面更好地解决问题。Java虚拟机从Java语言的虚拟机项多语言虚拟机方向发展。

1.5.3 多核并行

       Cpu硬件的发展从高频率转向多核心,随着多核时代的到来,软件开发越来越关注并行编程。Jdk1.5引入的java.util.concurrent包实现了一个粗粒度的并发框架,Jdk1.7加入的java.util.concurrent.forkjoin包是这个框架的一次扩充。Fork/Join模式是处理并行编程的一个经典方法,在此模式的使用范围内,能够轻松利用多个cpu核心提供的计算资源来协作完成一个复杂的计算任务。

 

 

Java8中,提供了Lambda支持,极大改善了Java语言不适合函数式编程的现状(之前java语言使用函数式编程,会显得很臃肿),函数式编程的一个优点是这样的程序天然地适合并发运行。

       openJdk的子项目Sumatra,显卡的算术运算能力、并行能力已经远远超过CPU,在图形领域以外发掘显卡的潜力是计算机发展的方向之一。Sumatra项目是为Java提供使用GPUGraphics Processing Units)和APUAccelerated Processing Units)运算能力的工具。

 

1.5.4 语法扩充

       Java5以来,对Java语法做了几次扩充,加入了自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环等。

Coin项目对语法细节的修改,包括二进制数的原生支持、在switch语句中支持字符串、“< >”操作符、异常处理的改进,简化变长参数方法调用、面向资源的try-catch-finally语句等。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
深入java虚拟第二 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和遇 1.3 体系结构 1.3.1 Java虚拟 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 Java程序设计语言 1.4 Java体系结构的代价 1.5 结论 1.6 资源页 第2章 平台无关 2.1 为什么要平台无关 2.2 Java的体系结构对平台无关的支持 2.2.1 Java平台 2.2.2 Java语言 2.3.3 Java class文件 . 2.2.4 可伸缩性 2.3 影响平台无关性的因素 2.3.1 Java平台的部署 2.3.2 Java平台的本 2.3.3 本地方法 2.3.4 非标准运行时库 2.3.5 对虚拟的依赖 2.3.6 对用户界面的依赖 2.3.7 Java平台实现中的bug 2.3.8 测试 2.4 平台无关的七个步骤 2.5 平台无关性的策略 2.6 平台无关性和网络移动对象 2.7 资源页 第3章 安全 3.1 为什么需要安全性 3.2 基本沙箱 3.3 类装载器体系结构 3.4 class文件检验器 3.4.1 第一趟:class文件的结构检查 3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10 保护域 3.11 访问控制器 3.11.1 implies()方法 3.11.2 栈检查示例 3.11.3 一个回答“是”的栈检查 3.11.4 一个回答“不”的栈检查 3.11.5 doPrivileged()方法 3.11.6 doPrivileged()的一个无效使用 3.12 Java安全模型的不足和今后的发展 方向 3.13 和体系结构无关的安全性 3.14 资源页 第4章 网络移动性 4.1 为什么需要网络移动性 4.2 一种新的软件模式 4.3 Java体系结构对网络移动性的支持 4.4 applet:网络移动性代码的示例 4.5 Jini服务对象:网络移动对象的示例 4.5.1 Jini是什么 4.5.2 Jini如何工作 4.5.3 服务对象的优点 4.6 网络移动性:Java设计的中心 4.7 资源页 第5章 Java虚拟 5.1 Java虚拟是什么 5.2 Java虚拟的生命周期 5.3 Java虚拟的体系结构 5.3.1 数据类型 5.3.2 字长的考量 5.3.3 类装载器子系统 5.3.4 方法区 5.3.5 堆 5.3.6 程序计数器 5.3.7 Java栈 5.3.8 栈帧 5.3.9 本地方法栈 5.3.10 执行引擎 5.3.11 本地方法接口 5.4 真实器 5.5 一个模拟:“Eternal Math” 5.6 随书光盘 5.7 资源页 第6章 Java class文件 6.1 Java class文件是什么 6.2 class文件的内容 6.3 特殊字符串 6.3.1 全限定名 6.3.2 简单名称 6.3.3 描述符 6.4 常量池 6.4.1 CONSTANT_Utf8_info表 6.4.2 CONSTANT_Integer_info表 6.4.3 CONSTANT_Float_info表 6.4.4 CONSTANT_Long_info表 6.4.5 CONSTANT_Double_info表 6.4.6 CONSTANT_Class_info表 6.4.7 CONSTANT_String_info表 6.4.8 CONSTANT_Fieldref_info表 6.4.9 CONSTANT_Methodref_info表 6.4.10 CONSTANT_InterfaceMethodref_ info表 6.4.11 CONSTANT_NameAndType_info 表 6.5 字段 6.6 方法 6.7 属性 6.7.1 属性格式 6.7.2 Code属性 6.7.3 ConstantValue属性 6.7.4 Deprecated属性 6.7.5 Exceptions属性 6.7.6 InnerClasses属性 6.7.7 LineNumberTable属性 6.7.8 LocalVariableTable属性 6.7.9 SourceFile属性 6.7.10 Synthetic属性 6.8 一个模拟:“Getting Loaded” 6.9 随书光盘 6.10 资源页 第7章 类型的生命周期 7.1 类型装载、连接与初始化 7.1.1 装载 7.1.2 验证 7.1.3 准备 7.1.4 解析 7.1.5 初始化 7.2 对象的生命周期 7.2.1 类实例化 7.2.2 垃圾收集和对象的终结 7.3 卸载类型 7.4 随书光盘 7.5 资源页 第8章 连接模型 8.1 动态连接和解析 8.1.1 解析和动态扩展 8.1.2 类装载器与双亲委派模型 8.1.3 常量池解析 8.1.4 解析CONSTANT_Class_info入口 8.1.5 解析CONSTANT_Fieldref_info 入口 S.1.6 解析CONSTANT_Methodref_info 入口 8.1.7 解析CONSTANT_Interface- Methodref_info入口 8.1.8 解析CONSTANT_String_info入口 8.1.9 解析其他类型的入口 8.1.10 装载约束 8.1.11 编译时常量解析 8.1.12 直接引用 8.1.13 _quick指令 8.1.14 示例:Salutation程序的连接 8.1.15 示例:Greet程序的动态扩展 8.1.16 使用1.1本的用户自定义类装 载器 8.1.17 使用1.2本的用户自定义类装 载器 8.1.18 示例:使用forName()的动态扩展 8.1.19 示例:卸载无法触及的greeter类 8.1.20 示例:类型安全性与装载约束 8.2 随书光盘 8.3 资源页 第9章 垃圾收集 9.1 为什么要使用垃圾收集 9.2 垃圾收集算法 9.3 引用计数收集器 9.4 跟踪收集器 9.5 压缩收集器 9.6 拷贝收集器 9.7 按代收集的收集器 9.8 自适应收集器 9.9 火车算法 9.9.1 车厢、火车和火车站 9.9.2 车厢收集 9.9.3 记忆集合和流行对象 9.10 终结 9.11 对象可触及性的生命周期 9.11.1 引用对象 9.11.2 可触及性状态的变化 9.11.3 缓存、规范映射和临终清理 9.12 一个模拟:“Heap of Fish” 9.12.1 分配鱼 9.12.2 设置引用 9.12.3 垃圾收集 9.12.4 压缩堆 9.13 随书光盘 9.14 资源页 第10章 栈和局部变量操作 10.1 常量入栈操作 10.2 通用栈操作 10.3 把局部变量压入栈 10.4 弹出栈顶部元素,将其赋给局部变量 10.5 wide指令 10.6 一个模拟:“Fibonacci Forever” 10.7 随书光盘 10.8 资源页 第11章 类型转换 11.1 转换操作码 11.2 一个模拟:“Conversion Diversion” 11.3 随书光盘 11.4 资源页 第12章 整数运算 12.1 二进制补码运算 12.2 Inner Int:揭示Java int类型内部性质 的applet 12.3 运算操作码 12.4 一个模拟:“Prime Time” 12.5 随书光盘 12.6 资源页 第13章 逻辑运算 13.1 逻辑操作码 13.2 一个模拟:“Logical Results” 13.3 随书光盘 13.4 资源页 第14章 浮点运算 14.1 浮点数 14.2 Inner Float:揭示Java float类型内部 性质的applet 14.3 浮点模式 14.3.1 浮点值集合 14.3.2 浮点值集的转换 14.3.3 相关规则的本质 14.4 浮点操作码 14.5 一个模拟:“Circle of Squares” 14.6 随书光盘 14.7 资源页 第15章 对象和数组 15.1 关于对象和数组的回顾 15.2 针对对象的操作码 15.3 针对数组的操作码 15.4 一个模拟:“Three—Dimensional Array” 15.5 随书光盘 15.6 资源页 第16章 控制流 16.1 条件分支 16.2 五条件分支 16.3 使用表的条件分支 16.4 一个模拟:“Saying Tomato” 16.5 随书光盘 16.6 资源页 第17章 异常 17.1 异常的抛出与捕获 17.2 异常表 17.3 一个模拟:“Play Ball!” 17.4 随书光盘 17.5 资源页 第18章 finally子句 18.1 微型子例程 18.2 不对称的调用和返回 18.3 一个模拟:“Hop Around” 18.4 随书光盘 18.5 资源页 第19章 方法的调用与返回 19.1 方法调用 19.1.1 Java方法的调用 19.1.2 本地方法的调用 19.2 方法调用的其他形式 19.3 指令invokespecial 19.3.1 指令invokespecial和[init]()方法 19.3.2 指令invokespecial和私有方法 19.3.3 指令invokespecial和super关键字 19.4 指令invokeinterface 19.5 指令的调用和速度 19.6 方法调用的实例 19.7 从方法中返回 19.8 随书光盘 19.9 资源页 第20章 线程同步 20.1 监视器 20.2 对象锁 20.3 指令集中对同步的支持 20.3.1 同步语句 20.3.2 同步方法 20.4 Object类中的协调支持 20.5 随书光盘 20.6 资源页 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值