笔记--深入理解java虚拟机第二版

第一章  走近java

1.JDK(支持java程序开发的最小环境):java程序设计语言,java虚拟机,java API类库

   JRE(支持java程序运行的标准环境):java SE API子集,java虚拟机

2.java平台:Java Card支持java小程序(Applet);Java ME支持java程序在移动端;Java SE面向桌面;Java EE企业级应用

3.JDK1.5:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach)

   JDK1.6:动态语言支持、编译API、微型HTTP服务器API、锁与同步、垃圾收集、类加载

   JDK1.7:新的G1收集器、加强对非java语言的调用支持、升级类加载架构

   JDK1.8:Lambda表达式

4.64位比32位额外增加10%~30%的内存消耗,1.6提供了普通对象指针压缩功能,但需要更多代码

第二章  java内存区域与内存溢出异常

1.运行时数据区

   1.1程序计数器:当前线程执行的字节码的行号指示器,线程私有,没有OutOfMemeryError(OOME)异常

        *如果执行的是java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Native方法,计数器为空

   1.2虚拟机栈:用于存储局部变量表、操作数栈、动态链接、方法出口,线程私有,StackOverFlowError(SOFE)、OOME

   1.3本地方法栈:执行Native方法,OOME、SOFE

   1.4:存放对象实例,线程共享,可连续、可不连续,GC的主要区域,-Xmx堆的最大大小 -Xms堆的初始大小,OOME

   1.5方法区:存储类信息、常量、静态变量,即使编译器编译的代码,线程共享,永久代,可不连续,OOME

   1.6运行时常量池:存编译期生成的字面量和各种引用,运行期间也可能存常量,如String的intern(),OOME

   1.7直接内存:1.4中加入了NIO类,引入了一种基于通道和缓冲区的IO方式,他可以使用Native函数库直接分配堆外内存,然后通过java堆里的DirectoryByteBuffer对象最为这块内存的引用,避免在java堆和Native堆之间来回复制

2.对象的创建(new 反射 克隆 反序列化

   虚拟机接到new-->检查是否被加载过-->没有就加载-->分配内存

   如果内存规整,即占用的内存在一边,空闲的在另一边,指针在分界点,分配内存就是移动指针,分配内存称为“指针碰撞

   如果不规整,维护一个列表,分配空间给对象实例,然后更新列表,称为“空闲列表

   java堆是否规整由GC器是否带有压缩整理功能

   分配完之后初始化为0值

3.对象的内存布局:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)

   3.1对象头:第一部分用于存储对象自身的运行时数据,另一部分是类型指针确定对象是哪个类的实例

   3.2实例数据:对象存储的有效信息

   3.3对齐填充没意义,起占位符的作用

4.对象的访问定位:句柄、直接指针

   句柄:在堆里划出一部分内存作为句柄池,对象名指向句柄,句柄包含对象实例数据和类型数据的地址信息

   *优点:GC时对象位置移动时,不用改引用 

  直接指针:对象名指向new

   *优点:速度快

5.线程请求的栈深度大于虚拟机允许的最大深度,抛StackOverFlowError

   虚拟机栈在扩展栈时无法申请到足够的内存空间,抛OutOfMemeryError

   *单线程下,无论栈太小还是内存不足,都抛StackOverFlowError

第三章  垃圾收集器与内存分配策略

1.判断对象存亡方法

   1.1.引用计数法

   给对象添加一个引用计数器,每当有一个地方引用它,就加1,引用失效,就减1,为0时,对象不能再使用很难解决互相引用的问题

   1.2.可达性分析算法

   通过一系列被称为“GC Roots”的对象作为起点,当一个对象到GC Roots没有任何引用链时,该对象不可用

   *GC Roots包括:虚拟机栈中引用的对象;方法区中类静态属性引用的对象;方法区中常量引用的对象;本地方法栈中JNI引用的对象

2.引用

   强引用(GC不会回收)、软引用(有用但非必须)、弱引用(只能活到下次GC前)、虚引用

3.GC过程

   可达性分析后没有引用链-->标记并筛选-->筛选条件是该对象是否有必要执行finalize()方法-->对象没有覆盖finalize()方法或已经被虚拟机调用过,则没必要执行finalize()-->有必要执行,把对象放入F-Queue队列,稍后执行一个虚拟机自动建立的,低优先级的Finalizer线程,去触发finalize()方法-->GC对对象第二次标记-->如果二次标记前被引用过,就死不了,否则被回收

4.GC算法

   4.1.标记-清除算法:*缺点:效率低;产生不连续的内存碎片

   4.2.复制算法:分代算法

   4.3.标记-整理算法:标记后,让存活的向一段移动,其他的清掉,保证内存连续

5.何时何地GC

   5.1.安全点:程序执行到安全点时才能执行GC

   *选择标准:可以让程序长时间执行的地方

   主动式中断:GC需要中断线程的时候,不去直接对线程操作,而是设置一个标志,线程轮询这个标志,标志为真时自己中断

   5.2.安全区域:一段代码片段中,引用关系不会发生改变,在这里GC是安全的

6.分配策略

   优先进入Eden;

   大对象直接进入老年代;

   年龄到一定程度(默认15岁)进入老年代;

   survivor中相同年龄所有对象大小的和大于等于survivor的一半,这些对象以及比它们年龄大的对象进入老年代

第六章  类文件结构

1.Class文件是一组以8位字节为基础单位的二进制流,各个数据项目紧密排列,没有分隔符
   伪结构:无符号数和表
2.(未完待续)

第七章  虚拟机类加载机制

1.把描述类的数据从Class文件加载到内存,对数据进行校验,转换解析,初始化,最终形成虚拟机直接使用的java类型
2.通过子类引用父类的静态字段,不会导致子类初始化;通过数组定义来引用类,不会初始化;常量在编译阶段就进入常量池,不会引起初始化
3.比较两个类相等,只有这两个类是由同一个类加载器加载的才有意义。
4.启动类加载器Bootstrap ClassLoader、扩展类加载器Extension ClassLoader、应用程序类加载器Application ClassLoader
5.双亲委派模型,父子关系由组合来实现,一个类加载器接受请求后,先请求父加载器,最终传送到启动加载器,只有当父类解决不了,才由子类自己加载

第八章  虚拟机字节码执行引擎

1.执行引擎执行java代码有两种方法:解释执行(通过解释器执行),编译执行(即时编译器产生的本地代码执行)

第十章  早期优化

1.泛型包括:泛型类、泛型接口、泛型方法
2.两个方法名和参数相同,返回值不同,也可以存在一个Class文件中
3.自动装箱的陷阱
Integer a = 1; 
Integer b = 2;
Integer c = 3; 
Integer d = 3;
Integer e = 321; 
Integer f = 321;
Long g = 3L;
c == d; // true      e == f; // false Integer在没有基本运算的状态下,不会自动拆箱,范围是-128~127
c == (a + b); // true      c.equals(a + b); // true
g == (a + b); // true      g.equals(a + b); // false 类型不同

第十二章  晚期优化

1.即时编译器:在运行时,虚拟机将代码编译成与本地平台相关的机器码,并进行各种层次的优化


























  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入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 按操作码字节值排列的操作码助

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值