Jvm前端编译

在Java技术下谈“编译器”而没有具体上下文语境,其实是一句很含糊的表述。

阅读更多

类加载器

7.4 类加载器

类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作在Java 虚拟机外部实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)。

阅读更多

虚拟机类加载机制

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。与其他语言不同,Java语言中,类型的加载、连接和初始化都是在程序运行期间完成的。

阅读更多

类文件结构

代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。

6.1 概述

实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不与包括Java语言在内的任何程序语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。

阅读更多

Java对象初始化顺序

Java对象初始化:先从代码块开始,再去执行构造函数。

*先初始化父类的静态代码—>初始化子类的静态代码–>初始化父类的非静态代码—>初始化父类构造函数—>初始化子类非静态代码—>初始化子类构造函数*

阅读更多

垃圾收集算法

3.3 垃圾收集算法

从如何判定对象消亡的角度出发, 垃圾收集算法可以划分为”引用计数式垃圾收集“(Reference Counting GC)和”追踪式垃圾收集“(Tracing GC)两大类,这两类被称为”直接垃圾收集“和”间接垃圾收集“。

阅读更多

垃圾收集器1

Java和C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。

阅读更多

Java堆中对象的分配、布局和访问

2.3 HotSpot虚拟机对象探秘

2.3.1 对象的创建

当Java虚拟机遇到一条字节码new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否被加载、解析和初始化过。如果没有,则执行相应的类加载过程。

类加载通过后,VM将为其分配内存,内存大小在类加载完成后便可完全确定,其相当于把一块确定大小内存块从Java堆中划分出来。

内存分配有两种方式:指针碰撞和空闲列表,分别用于连续空间与非连续空间划分。

内存分配完后,VM需要将分配到的内存空间初始化为0值。

然后,VM还需要对对象进行必要的设置,例如这个对象是哪个类的实例,如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等。这些信息存放在对象的对象头中。

做完以上工作后,从VM的角度来看,一个新的对象已经诞生了。但是,从Java程序的角度来看,对象创建才刚刚开始,构造函数,既Class文件中的()方法还没有执行。

阅读更多