
Java 虚拟机
不止于代码
这个作者很懒,什么都没留下…
展开
-
Java 内存区域
内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。下面详细阐述各数据区所存储的数据类型。 程序计数器(Program Counter Register) 一块较小的内存空间,它是当前线程所执行...转载 2019-02-04 10:43:23 · 177 阅读 · 0 评论 -
JVM 中 Java 对象创建的过程
Java 虚拟机中对象创建可以具体分为 5 个步骤: 类加载检查 分配内存 初始化为零值 设置对象头(Object Header) 执行 <init> 方法 1、当 Java 虚拟机遇到一条 new 指令时,首先要做的是检查 new 指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析、初始化过。如果没有,必须先执行相应的类加载过程...原创 2019-02-04 12:11:43 · 347 阅读 · 0 评论 -
Java 虚拟机的类加载机制
Java 虚拟机类加载的全过程分为 加载、验证、准备、解析、初始化 5 个阶段。 1、加载 加载阶段,虚拟机需要完成以下三件事情: 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的这种数据的访问入口。 相比于类加载的其它阶段,加载阶段是...原创 2019-02-04 23:55:07 · 133 阅读 · 0 评论 -
<init>() 方法和 <clinit>() 方法的区别
<init>() 方法是实例构造器方法,对非静态变量解析初始化,在 new 一个对象时调用对象类的 constructor 方法时才会执行 <init>() 方法。而 <clinit>() 方法是类构造器方法,对静态变量,静态代码块进行初始化,在类加载过程的初始化阶段虚拟机会执行 <clinit>() 方法。 <init>() 方法是在...原创 2019-02-05 00:47:50 · 490 阅读 · 1 评论 -
可达性分析算法和 Java 中的引用
通过可达性分析(Reachability Analysis)可以判断对象是否存活,这个算法的基本思想是通过一系列称为 " GC Roots " 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连(即 GC Roots 到这个对象不可达)时,则证明此对象是不可用的。 即使在可达性分析算法中不可达的对象,也并非是 “ 非死不可 ”...原创 2019-02-05 10:22:02 · 569 阅读 · 0 评论 -
垃圾收集算法和垃圾收集器
几种常用的垃圾收集算法:标记 - 清除算法、复制算法、标记 - 整理算法、分代收集算法。 “ 标记 - 清除 ” (Mark - Sweep)算法 “ 标记 - 清除 ” (Mark - Sweep)算法是最基础的收集算法,它分为 “ 标记 ” 和 “ 清除 ” 两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象 。 它的主要不足有两个:一个是效率问题,标记和...原创 2019-02-06 13:39:25 · 138 阅读 · 0 评论 -
类加载器与双亲委派模型
类加载器 把类加载阶段中的 “ 通过一个 类的全限定名来获取描述此类的二进制字节流 ” 这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己去决定如何去获取所需要的类,实现这个动作的代码模块称为 “ 类加载器 ” 。 对于任意一个类,都需要由加载它的类加载器和这个类本身,一同确立其在 Java 虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。也就是说,比较两个类是否 “ ...原创 2019-02-06 15:09:24 · 123 阅读 · 0 评论 -
多态性实现机制——静态分派与动态分派
方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址。这个特性给Java带来了更强大的动态扩展能力,使得可以在类运行期间才能确定某些目标方法的直接引用,称为动态连接,也有一部分方法的符号引用在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析。 静态解析成立的前提...转载 2019-02-06 22:34:29 · 210 阅读 · 0 评论