JVM: 垃圾收集器 发表于 2017-01-05 | 分类于 JVM 垃圾收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。 HotSpot虚拟机的垃圾收集器如图所示,图中展示了7种分别作用于新生代和老年代的收集器,如果两个收集器之间存在连线,就说明可以搭配使用。 并发和并行 并行(Parallel):并行就是同时执行。 多条垃圾收集线程并行工作,但用户线 ... 阅读全文 »
JVM: 垃圾回收机制 发表于 2017-01-05 | 分类于 JVM 垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。Java堆和方法区的内存分配和回收是动态的,因而垃圾收集器所关注的也是这部分内存。 垃圾收集机制要考虑的两件事情:(1)发现无用对象(如何判断对象是否还“存活”);(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用(垃圾收集算法)。 对 ... 阅读全文 »
JVM: HotSpot虚拟机中的对象 发表于 2017-01-05 | 分类于 JVM 探讨HotSpot虚拟机在Java堆中的对象分配、布局和访问过程。 对象的创建 这里仅讨论普通的Java对象,不涉及数组和Class对象等 对象的创建过程: 虚拟机遇到一条new指令时,首先去检查这个指令的参数是否能够在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析 ... 阅读全文 »
JVM: Java虚拟机运行时数据区域 发表于 2017-01-05 | 分类于 JVM Java与C/C++之间有一堵由动态内存分配和垃圾收集技术所围成的“高墙”。 Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。 程序计数器程序计数器(Program Counter Register)是一块线程私有的内存空间,可以看作是当前线程所执行的字节码的 ... 阅读全文 »
JVM: 字节码执行引擎(2)-方法调用 发表于 2017-01-04 | 分类于 JVM 方法调用不同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。 解析 解析调用一定是个静态的过程,在编译期间就完全确定,在类加载的解析阶段就会把涉及的符号引用转换为可确定的直接引用,不会延迟到运行期再去完成。 所有方法调用中的目标方 ... 阅读全文 »
JVM: 字节码执行引擎(1)-概述 发表于 2017-01-04 | 分类于 JVM 执行引擎是JVM最核心的组成部分之一。 虚拟机执行引擎在执行代码的时候,可能会有解释执行(通过解释器执行)和编译执行(通过JIT编译器产生本地代码执行)两种选择。 虚拟机是一个相对于物理机的概念,它们都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚 ... 阅读全文 »
Class文件(2): 字节码指令 发表于 2017-01-03 | 分类于 JVM Java虚拟机字节码指令:由1个字节长度的操作码(代表着某种特定操作含义的数字),以及跟随其后的0至多个操作数(Operands,此操作所需的参数)而构成。 再次强调Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都包含操作数,而只有一个操作码。 指令的操作码长度为1个字节, ... 阅读全文 »
Class文件(1): 类文件结构 发表于 2017-01-03 | 分类于 JVM Write Once, Run Anywhere. 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode),是构成平台无关性的基石。 Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,中间没有任何分隔符。当遇到 ... 阅读全文 »
JVM: 类加载(2)-类加载器ClassLoader 发表于 2017-01-02 | 分类于 JVM 类加载器只用于完成整个类加载过程的加载(Loading)动作:类的加载阶段中“通过一个类的全限定名去获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让程序代码自己决定如何去获取所需要的类。 类加载器在类层次划分、OSGI、热部署、代码加密等领域被广泛应用。 类在虚拟机中的唯 ... 阅读全文 »
JVM: 类加载(1)-类加载机制 发表于 2017-01-02 | 分类于 JVM 类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 Java可以动态扩展的特性就是依赖运行期动态加载和动态连接这个特点实现的。 类加载的时机类的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生 ... 阅读全文 »