java程序内存加载_java内存加载机制

什么是java类加载?

类加载是指将.class类中的二进制数据存放到内存中,会在内存中的推中建立一个java.lang.String的引用对象来存放方法区的数据结构,而类中的数据会放到方法区中

34e923b4e964be85dfcced43826744cd.png

类加载器不需要等到某个类要用的时候在加载他,jvm允许预先加载,如果在加载的过程中有错误,类加载会抛出异常。但是如果在使用的过程当中没有用到错误的类,则程序是不受影响的

类的生命周期

加载——》验证——》准备——》解析——》初始化——》使用——》结束   其中 验证,准备,解析阶段属于 连接阶段

5d01d29b2dfbbe1902e1f3cd6b2cb502.png

说明:

加载:查找并加载二进制数据。

1,通过类名去找到定义的二进制数据

2,将字节流所代表的静态存储结构转化为方法区的运行数据结构

3,在java内存堆中生成一个java.lang.String 引用对象来方便作为对方法区的访问路口

连接过程 三个阶段

验证:确保被加载类的正确性

1.文件格式正确,验证文件字节流是否符合class文件格式规范

2.元数据验证:对字节码描述的信息语义进行分析,确保符合java语言规范

3.字节码验证:通过对字节控制流的分析,确保程序语义合法性

4.符号引用验证:确保解析动作的正确性

准备:为类的静态变量分配内存,并初始化值

解析:把类中的符号引用转成直接引用

初始化:为类的静态变量赋值,jvm负责对类初始化,主要对类变量的初始化

1,声明变量指定初始值

2,使用静态代码块为类变量赋值

jvm初始化步骤:

1,如果这个类没有被加载,那么程序先加载连接

2,如果类的直接父类没有被加载,则先初始化父类

3,如果类中有初始化语句,则依次执行初始化语句

结束:

1,system.exit()语句

2,程序正常结束

3,程序异常或错误

4,jvm虚拟机停止

JVM加载机制

1,全盘加载:当一个类的加载器加载某个类的时候,该类的所有东西都归这个类加载器加载,除非显示了要被另外一个加载器加载

2,父类加载:加载某个类的时候,由他的父类加载,如果父类找不到或者加载失败,则才会自己加载

3,缓存加载:所有加载过的class会放在缓存中,当需要加载某个class的时候会到缓存中去找这个class。如果找不到,则会重新去读取该class的二进制数据,然后重新加载放到缓存中。这就是为什么当修改了class文件后要重启jvm的原因

类加载有三种方式

1,jvm命令加载

2,Class.forName()方法加载

3,ClassLoader.loadClass()加载

区别:forName()不紧会将类加载到jvm中,而且会执行其构造方法,而loadClass()只会将类加载到jvm中,但是不会执行其方法

双亲委派模式

双亲委派模式会把类拖给父类加载,父类又给父类的父类加载,就像递归一样,一层一层往上丢。如果父类加载不到它,它才会自己加载

classLoader源码分析

public Class> loadClass(String name)throws ClassNotFoundException {

return loadClass(name, false);

}

protected synchronized Class> loadClass(String name, boolean resolve)throws ClassNotFoundException {

// 首先判断该类型是否已经被加载

Class c = findLoadedClass(name);

if (c == null) {

//如果没有被加载,就委托给父类加载或者委派给启动类加载器加载

try {

if (parent != null) {

//如果存在父类加载器,就委派给父类加载器加载

c = parent.loadClass(name, false);

} else {

//如果不存在父类加载器,就检查是否是由启动类加载器加载的类,通过调用本地方法native Class findBootstrapClass(String name)

c = findBootstrapClass0(name);

}

} catch (ClassNotFoundException e) {

// 如果父类加载器和启动类加载器都不能完成加载任务,才调用自身的加载功能

c = findClass(name);

}

}

if (resolve) {

resolveClass(c);

}

return c;

}

原文来自:http://www.cnblogs.com/ityouknow/p/5603287.html  此博客将的非常清楚,大家如果有兴趣可以去仔细阅读下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值