深入理解Java虚拟机读书笔记
文章平均质量分 93
整理每章节核心内容,方便回顾
黄智霖-blog
骨灰级技术爱好者
展开
-
《深入理解Java虚拟机》读书笔记(十)--晚期(运行期)优化(下)
目录一、公共子表达式消除二、数组边界检查消除三、隐式异常处理四、方法内联五、逃逸分析六、Java与C/C++的编译器对比一、公共子表达式消除 如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为公共子表达式。对于这种表达式,没有必要花时间再对它进行计算,只需要直接用前面计算过的结果代替E就行了。如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除,如果优化的范围涵盖了多个基本块,就称为全局公共子表达式消除。 对于以下代码:int d原创 2021-03-27 03:07:21 · 3830 阅读 · 4 评论 -
《深入理解Java虚拟机》读书笔记(十)--晚期(运行期)优化(上)
文章目录一、HotSpot虚拟机内部的即时编译器1.1 解释器和编译器1.2 编译对象和触发条件1.2.1 方法调用计数器1.2.2 回边计数器1.3 编译过程二、编译优化技术2.1 方法内联2.2 冗余访问消除2.3 复写传播2.4 无用代码消除一、HotSpot虚拟机内部的即时编译器1.1 解释器和编译器 当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获得更高的执行效率。原创 2021-03-25 01:47:55 · 5402 阅读 · 6 评论 -
《深入理解Java虚拟机》读书笔记(九)--早期(编译期)优化
目录一、Javac编译器1.1 解析与填充符号表1.1.1 词法、语法分析1.1.2 填充符号表1.2 注解处理器1.3 语义分析与字节码生成二、使用步骤1.引入库2.读入数据总结一、Javac编译器Javac的编译过程大致可以分为3个过程,分别是:解析与填充符号表过程插入式注解处理器的注解处理过程分析与字节码生成过程1.1 解析与填充符号表1.1.1 词法、语法分析 词法分析是将源码的字符流转变为标记(Token)集合,单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元原创 2021-03-23 03:00:28 · 6110 阅读 · 2 评论 -
《深入理解Java虚拟机》读书笔记(八)--类加载及执行子系统案例(Tomcat类加载、OSGI、动态代理)
一、Tomcat类加载器架构作为一个web服务器,需要解决以下几个问题:部署在同一个服务器上的web应用程序所使用的Java类库可以实现相互隔离。 部署在同一个服务器上的两个web应用程序所使用的Java类库可以互相共享。 服务器需要尽可能保证自身的安全不受部署的web应用程序影响。 JSP需要支持热更新由于存在上述问题,单独的一个classpath无法满足需求,所以web服务器都提供了好几个classpath路径供用户存放第三方类库。在Tomcat目录结构中,有3组目录(“/common/原创 2021-03-17 01:25:30 · 12790 阅读 · 19 评论 -
关于使用MethodHandle在子类中调用祖父类重写方法的探究
注:这个例子本出现在周志明先生的《深入理解Java虚拟机》虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里解释一下(原文在《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下))。这里直接把代码列出来:package test;import java.lang.invoke.MethodHandles;import java.lang.invoke.MethodType;import java.lang.reflect.Field;public class Te.原创 2021-03-11 13:25:50 · 5241 阅读 · 8 评论 -
《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下)
一、Java动态类型语言支持动态类型语言的关键特征是它的类型检查的主体过程是在运行期而不是编译期,满足这个特征的语言有很多,比如JavaScript、Python等,相对的,在编译期就进行类型检查的语言(如C++/Java等)就是最常用的静态类型语言。例如以下代码:obj.println("hello world");假设这行代码在Java语言中,并且变量obj的静态类型为java.io.PrintStream,那么变量obj的实际类型就必须是PrintStream的子类(实现了Print原创 2021-03-08 00:10:32 · 11094 阅读 · 29 评论 -
《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(上)
目录前言一、运行时栈帧结构1.1 局部变量表1.2 操作数栈1.3 动态连接1.4 方法返回地址1.5 附加信息二、确定执行方法2.1 解析2.2 分派2.2.1 静态分派2.2.2 动态分派2.2.3 单分派和多分派2.2.4 虚拟机动态分派的实现前言本章主要讲述虚拟机如何确定调用方法的版本和如何执行方法。一、运行时栈帧结构1.1 局部变量表用于存放方法参数和方法内定义的局部变量。在编译阶段,就在方法表的Code属性的max.原创 2021-03-07 02:18:30 · 7685 阅读 · 10 评论 -
《深入理解Java虚拟机》读书笔记(六)--虚拟机类加载机制(下)
一、类加载器与类通过一个类的全限定名来获取描述此类的二进制字节流,实现这个动作的代码模块称为“类加载器”。用户可以使用自定义的类加载器,以此自己决定如何去获取所需要的类。在虚拟机中,对于任何一个类的唯一性是由加载它的类加载器和这个类的全限定名共同确定的,每一个类加载器都有一个独立的类命名空间。这里需要注意的是,对于相同全限定名的类,如果类加载器不同,会影响到类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法的返回结果,也会影响使用inst原创 2021-03-03 23:54:22 · 10890 阅读 · 4 评论 -
《深入理解Java虚拟机》读书笔记(六)--虚拟机类加载机制(上)
一、概述所谓类加载机制,就是虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。Java的类加载、连接和初始化过程都是在程序运行期间完成的,这虽然会让类加载时增加性能开销,但是提供了高度的灵活性。二、类加载的时机类的整个生命周期包括加载、验证、准备、解析、初始化、使用和卸载7个阶段,其中验证、准备、解析3个部分统称为连接。其中,加载、验证、准备、初始化和卸载5个阶段的顺序是固定的,类加载需要按照这种顺序开始(只是原创 2021-03-01 01:14:13 · 3819 阅读 · 6 评论 -
《深入理解Java虚拟机》读书笔记(五)--类文件结构
注:书中第五章-调优案例分析与实战,包含几个案例分析和eclipse调优,但是其中的例子很简单,就先不整理到笔记里了原创 2021-02-28 16:15:31 · 6992 阅读 · 21 评论 -
《深入理解Java虚拟机》读书笔记(四)--虚拟机性能监控与故障处理工具
一、JDK命令行工具此书是第二版,本章介绍的工具基于Windows平台下的JDK 1.6 Update 21。1.1 jps:虚拟机进程状况工具可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称(main函数所在类)以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。其常用选项见下表;jps工具主要选项 选项 作用 -q 只输出LVMID -m 输出虚拟机进程启动时传递给main函数的参数 -l原创 2021-02-22 00:42:20 · 4363 阅读 · 6 评论 -
《深入理解Java虚拟机》读书笔记(三)--垃圾收集器与内存分配策略(下)
目录一、垃圾收集器1.1 Serial收集器1.2 ParNew收集器1.3 Parallel Scavenge1.4 Serial Old收集器1.5 Parallel Old收集器1.6 CMS收集器1.7 G1收集器二、GC日志三、GC分类四、对象分配与空间分配担保五、总结一、垃圾收集器Java虚拟机规范中对垃圾收集器应该如何实现没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己原创 2021-02-21 02:49:19 · 5063 阅读 · 7 评论 -
《深入理解Java虚拟机》读书笔记(三)--垃圾收集器与内存分配策略(上)
一、垃圾回收1.1 判断对象是否可用判断对象是否可用主要有两种方法:引用计数法和可达性分析。引用计数法:给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效时,计数器就减1;任何时刻计数器为0的对象就是不再被使用的。python、Squirrel等使用这种算法。优点:实现简单,效率高缺点:可能出现循环引用(A引用B,B引用A,除此之外再没有任何地方引用A和B,由于两者相互引用,计数不为0)可达性分析:通过一系列的被称为“GC Roots”的对象作为起始点,从这些节原创 2021-02-18 01:31:56 · 7800 阅读 · 13 评论 -
《深入理解Java虚拟机》读书笔记(二)--自动内存管理机制
目录一、运行时数据区域1.1 程序计数器1.2 虚拟机栈1.2.1 局部变量表1.3 本地方法栈1.4 堆1.5 方法区1.5.1 运行时常量池1.5.2 本地直接内存二、HotSpot 虚拟机对象探秘2.1 对象的创建2.1.1 内存空间分配2.2 对象内存布局2.2.1 对象头2.2.2 实例数据2.2.3 对齐填充2.3 对象的访问定位2.3.1 句柄2.3.2 直接指针三、总结一、运行时数据区域Java虚拟机在执原创 2021-02-17 01:47:34 · 9208 阅读 · 15 评论 -
《深入理解Java虚拟机》读书笔记(一)--Java和Java虚拟机发展
目录一、Java发展史二、Java虚拟机(部分)2.1 Sun Classic VM2.2 Sun Exact VM2.3 Sun HotSpot VM2.4 BEA JRockit VM2.5 BEA Liquid VM2.6IBM J9 VM2.7 Azul VM2.8 Microsoft JVM三、总结一、Java发展史1991年4月,James Gosling博士领导绿色计划(Green Project),产品为Java语言的前身:Oak(橡树).原创 2021-02-16 21:47:35 · 4829 阅读 · 5 评论