java 虚拟机详解_JAVA虚拟机简单讲解

java虚拟机

java 虚拟机通过装载、连接、和初始化一个类型,使得该类型可以被正在运行的java程序运行

1.装载:把二进制形式的java类读入java虚拟机中(class文件)

2.连接:把装载的二进制形式的类型数据合并到虚拟机的运行状态中去

1.验证:确保Java类型数据格式正确并且适合于Java虚拟机使用。

2.准备:负责为该类型分配它所需内存。

3.解析:把常量池中的符号引用转换为直接引用。(可推迟到运行中的程序真正使用某个符号引用时再解析)

3.初始化:为类变量赋适当的初始值

5445e42d0da9e0efbc781d62b591300d.pngjava7 虚拟机内存管理

所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化。以下六种情况符合主动使用的要求:

1.当创建某个类的新实例时(new、反射、克隆、序列化)

2.调用某个类的静态方法

3.使用某个类或接口的静态字段,或对该字段赋值(用final修饰的静态字段除外,它被初始化为一个编译时常量表达式)

4.当调用Java API的某些反射方法时。

5.初始化某个类的子类时。

6.当虚拟机启动时被标明为启动类的类。

除以上六种情况,所有其他使用Java类型的方式都是被动的,它们不会导致Java类型的初始化。

父类需要在子类初始化之前被初始化,所以这些类应该被装载了。当实现了接口的类被初始化的时候,不需要初始化父接口。然而,当实现了父接口的子类(或者是扩展了父接口的子接口)被装载时,父接口也要被装载。(只是被装载,没有初始化)

类加载器

对于每个被装载的类型,Java虚拟机都会为他创建一个java.lang.Class类的实例来代表该类型

当JVM启动的时候,Java缺省开始使用如下三种类型的类加载器:

1、启动(Bootstrap)类加载器:引导类加载器是用 本地代码实现的类加载器,它负责将 /lib下面的核心类库 或 -Xbootclasspath选项指定的jar包等 虚拟机识别的类库 加载到内存中

2、扩展(Extension)类加载器:它负责将 /lib/ext或者由系统变量-Djava.ext.dir指定位置中的类库 加载到内存中

3、它负责将 用户类路径(java -classpath或-Djava.class.path变量所指的目录,即当前类所在路径及其引用的第三方类库的路径,如第四节中的问题6所述)下的类库 加载到内存中

双亲委托

JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归 (本质上就是loadClass函数的递归调用)。因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。如果父类加载器可以完成这个类加载请求,就成功返回;只有当父类加载器无法完成此加载请求时,子加载器才会尝试自己去加载。事实上,大多数情况下,越基础的类由越上层的加载器进行加载,因为这些基础类之所以称为“基础”,是因为它们总是作为被用户代码调用的API(当然,也存在基础类回调用户用户代码的情形)

48ab7a13a7edffbd8e2837f981d8ce5e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值