深入理解Java虚拟机
深入理解Java虚拟机——读书笔记
法海你懂不
梦想每个人都有,但不是每个人都有勇气去坚信...
展开
-
Java 程序执行顺序
Java程序执行顺序Java程序的执行顺序大概可以分成三个部分。 1.静态属性:静态方法声明,静态块。 2.动态属性:普通方法声明,构造块。 3.构造方法。而如果类与类之间存在继承关系的话,那么会先执行父类的静态属性,接着执行子类的静态属性;然后是父类的动态属性,父类的构造方法;接着执行子类的动态属性;子类的构造方法。至此,Java程序便执行完成。借用想知道Java代原创 2018-01-22 22:19:37 · 2510 阅读 · 1 评论 -
Java虚拟机内存区域划分
Java程序运行时的数据区域Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存主要包含下图所示的几个运行时数据区域。程序计数器(PC Registers)程序计数器是一块比较小的内存空间,它...原创 2018-02-12 11:15:02 · 240 阅读 · 0 评论 -
Java 对象的创建的过程
Java是一门面向对象的语言,创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象的创建又是怎样的一个过程呢?Java对象创建过程虚拟机遇到一个new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有那么必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内...原创 2018-02-12 12:14:01 · 301 阅读 · 0 评论 -
Java 对象的内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、 实例数据(Instance Data)、对齐填充(Padding)。对象头HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据;第二部分用于存储类型指针。存储对象自身的运行时数据这部分数据有HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏...原创 2018-02-13 09:21:48 · 1073 阅读 · 1 评论 -
Java 对象的访问定位
建立对象是为了使用对象,Java程序通过栈上的reference数据来操作堆上的具体对象。目前主流的访问方式有使用句柄和直接指针两种。使用句柄访问如果使用句柄访问方式,Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息如下图所示:使用直接指针访问如果使用直接指针访问方式,j...原创 2018-02-13 09:39:57 · 248 阅读 · 0 评论 -
垃圾收集器概述
垃圾收集器(Garbage Collection, GC)的历史可以追溯到1960年MIT的第一门真正使用内存动态分配和垃圾收集技术的语言——Lisp。人们当时就在思考GC需要完成的3件事: 哪些内存需要回收? 什么时候回收? 如何回收?经过半个世纪的发展,目前内存的动态分配与内存回收技术已经相当成熟。在Java这门语言中, 程序计数器、虚拟机栈、本地方法栈三个区...原创 2018-02-16 20:02:57 · 234 阅读 · 0 评论 -
垃圾收集算法
在确定了哪些垃圾可以被回收后,垃圾收集器要做的事情就是开始进行垃圾回收,但是这里面涉及到一个问题是:如何高效地进行垃圾回收。由于Java虚拟机规范并没有对如何实现垃圾收集器做出明确的规定,因此各个厂商的虚拟机可以采用不同的方式来实现垃圾收集器,所以在此只讨论几种常见的垃圾收集算法的核心思想。标记-清除算法标记-清除算法(Mark-Sweep)这是最基础的垃圾回收算法,之所以说它是最基础的是...原创 2018-02-16 22:02:10 · 257 阅读 · 0 评论 -
HotSpot 对算法的实现
前面垃圾收集器概述和垃圾收集算法两节从理论上介绍了对象存活判断算法和垃圾收集算法,本节则主要介绍HotSpot对上述算法的实现规则。枚举根节点可达性算法中从GC Roots节点找到引用链这个操作可能会因为巨大的方法区而导致大量时间的消耗,而且可达性分析会因为GC停顿的原因而导致执行时间的敏感。由于目前的主流java虚拟机使用的都是准确式GC,所以当执行系统停顿下来之后,并不需要一个不漏...原创 2018-02-16 23:24:20 · 332 阅读 · 0 评论 -
7种垃圾收集器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。接下来讨论的收集器基于JDK1.7 Update 14 之后的HotSpot虚拟机(在此版本中正式提供了商用的G1收集...原创 2018-02-17 15:39:46 · 3042 阅读 · 0 评论 -
内存分配与回收策略
Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题:给对象分配内存回收分配给对象的内存回收分配给对象的内存在前面几节中已经说明过了。对象的内存分配简单来说就是按照某种分配策略在堆上分配空间,而分配策略也并不是固定不变的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中内存相关参数的位置。内存分配规则就目前而言,JVM分代是Java垃圾收集...原创 2018-02-17 16:46:15 · 177 阅读 · 0 评论 -
Class类文件的结构
class文件是一组以8位字节为基础的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中,中间没有任何分隔符,这点和png、jpg等图片文件格式类似。当遇到需要占用8位字节以上空间的数据项时,则会按照一定的字节顺序分隔为若干个8位字节进行存储。Java虚拟机规范规定class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表。 ...原创 2018-02-18 14:18:43 · 523 阅读 · 0 评论 -
类的整个生命周期
上一节介绍了Class文件的结构,但是最终Class文件中描述的信息最终要加载到虚拟机中之后才能使用。虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机使用的Java类型。在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java之...原创 2018-02-18 20:47:41 · 1342 阅读 · 0 评论 -
类加载器
在类的整个生命周期一节中,在加载一节中提到 通过一个类的全限定名来获取定义此类的二进制字节流事实上,虚拟机设计团队把这部分的操作放置到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类,而实现这部分操作的代码称为类加载器。类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。...原创 2018-02-18 21:59:28 · 173 阅读 · 0 评论 -
虚拟机字节码执行引擎
字节码就像是汇编语言,是 JVM 的指令集。执行引擎是 Java 虚拟机最核心的组成部分之一。“虚拟机” 是一个相对于 “物理机” 的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行哪些不被硬件直接支持的指令集格式。在 Java ...原创 2018-02-19 13:43:16 · 179 阅读 · 0 评论 -
早期(编译期)优化
Java语言的“编译期”是一段不确定的操作过程,可能是:前端编译器(编译器的前端)把Java文件转换为class文件。Sun 的 Javac、 Eclipse JDT 中的增量式编译器( ECJ)。后端编译器(JIT编译期 Just in time compiler)把字节码变成机器码。JIT 编译器: HotSpot VM 的 C1、 C2 编译器。静态编译器(AOT编译器 ahead...原创 2018-02-20 15:26:41 · 249 阅读 · 0 评论 -
晚期(运行期)优化
在部分的商用虚拟机(Sun HotSpot、IBM J9)中,Java 程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码” (Hot Spot Code)。 为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Ju...原创 2018-02-20 22:20:25 · 214 阅读 · 0 评论 -
Java内存模型与线程
让计算机去同时处理几件事情可以充分利用计算机处理器,从另一个场景来看,一个服务器同时对多个客户端提供服务也是一个并发应用场景。衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second, TPS)是最重要的指标之一,它代表着一秒内服务器端平均能响应的请求总数,而TPS值与程序的并发能力又有非常密切的关系。 对于计算量相同的任务,程序线程并发协调得有条不紊,效率自然...原创 2018-02-21 16:13:46 · 193 阅读 · 0 评论 -
线程安全与锁优化
当多个线程访问一个对象时,如果不用考虑这些线程在运行环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象时线程安全的。 —— Brian GoetzJava语言中的线程安全按照线程安全的“安全程度”由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相...原创 2018-02-21 17:54:30 · 209 阅读 · 0 评论