JVM类加载机制
2015-09-17 23:20
183 查看
JVM类加载机制
目录:
JVM加载的过程
加载
为什么需要加载?
加载什么?
怎么加载?
JVM加载类的工具
系统自带工具
Bootstrap,根加载器(C++),程序员不可见
扩展类加载器(Java),程序员可见
系统加载器(Java),程序员可见
用户自定义工具
加载的结果是什么?
连接
验证『万一要是用户自己写的加载器加载的.class文件不符合JVM规范怎么办?--验证之』
准备『给类的静态变量分配内存,并且设置默认值』/补充这边是和变异期常量有关系吗?
解析
初始化『JVM遇到6种情况的时候,就会初始化类,把用户给的值赋值给对应的变量』
为什么需要加载?--java程序经过编译成. class文件,再装在到内存里面(由classloader执行),这样才能执行java程序
AWT,聊天程序中可以使用该方法
加载
加载什么?--class 文件从硬盘到内存的迁移
也就是在堆区域创建一个Class类的对象『类的名称是 Class』
Class对象是JVM在加载对应的类文件 到方法区之后,在堆区 生成一个与该类文件对应的Class对象。强调:不管这个类生成多少个对象,狱该类对应的Class对象只有一个
Class对象可以封装类在『方法区』内的数据结构:类里面的内容,都可以通过Class对象获得,像镜子一样,是整个反射的入口,可以看到目标类的关联的class结构,通过Class对象可以访问目标类的字段和方法
怎么加载?
加载方式
加载的工具
根类加载器C++,系统类加载器和扩展列加载器是java
Classloader类,将二进制名称转换成文件名,然后尝试着从文件系统读取该名称的.class文件
加载的结果
连接:
即本来用javac进行编译,但是有些人自己编译,生成的字节码文件不符合jvm对字节码文件的规范,因此需要检测
强调静态变量(static):此时对象还不存在,此时还不涉及实例方法。静态变量不属于某一个对象,是属于一个类的,所有的该类的对象都可以调用该静态变量。因此在该类加载到内存的时候,就可以给给静态变量分配内存了,并且初始化为默认值 boolean类型:false,int 类型:0等
【感觉像是一个屋子在规划的时候,就要划分好公共空间,之后要是有具体的别人住进来之后,可以根据不同人的不同的需求在各自的地方进行活动,但是公用的部分一定是在建设一始就划分好的,比如小区的公园和卫生间,并且要公园里面的花花草草给弄好,不能说就建了一个花园的大概的外围,里面什么都不搞,连地都不松一下土,这不行,还有比如卫生间,也是要把里面的设备搞齐全了,冲水的设备,纸篓都要放好,不能等业主进来了使用的时候才发现,“我擦,怎么什么都只是空样子”!至于后来小区业主进来了,可以在自己家里面再搞其他的花草什么的别人也管不了,】
解析:之后再说 /2015.04.29补充:这边的解析 是将符号饮用转换为直接引用,是多态中后期绑定的内容吗?
初始化:这个不和『连接』里面的『准备』重复吗?
不重复
因为此时是把用户想赋的值赋值给静态变量
举例:
首先,JVM会在『连接』的准备阶段 执行 『i=0』。准备阶段结束,执行解析,解析结束之后
解析完成,执行『初始化』:把3显示赋值给i;
此时完成类的初始化,此时仍然没有对象的生成
new Test();
int b=Tetst.a;或者 Test.a=b;
Class.forName("classloader.Test");
启动类:含有main方法的类
来自为知笔记(Wiz)
目录:
JVM加载的过程
加载
为什么需要加载?
加载什么?
怎么加载?
JVM加载类的工具
系统自带工具
Bootstrap,根加载器(C++),程序员不可见
扩展类加载器(Java),程序员可见
系统加载器(Java),程序员可见
用户自定义工具
加载的结果是什么?
连接
验证『万一要是用户自己写的加载器加载的.class文件不符合JVM规范怎么办?--验证之』
准备『给类的静态变量分配内存,并且设置默认值』/补充这边是和变异期常量有关系吗?
解析
初始化『JVM遇到6种情况的时候,就会初始化类,把用户给的值赋值给对应的变量』
为什么需要加载?--java程序经过编译成. class文件,再装在到内存里面(由classloader执行),这样才能执行java程序
AWT,聊天程序中可以使用该方法
加载
加载什么?--class 文件从硬盘到内存的迁移
也就是在堆区域创建一个Class类的对象『类的名称是 Class』
Class对象是JVM在加载对应的类文件 到方法区之后,在堆区 生成一个与该类文件对应的Class对象。强调:不管这个类生成多少个对象,狱该类对应的Class对象只有一个
Class对象可以封装类在『方法区』内的数据结构:类里面的内容,都可以通过Class对象获得,像镜子一样,是整个反射的入口,可以看到目标类的关联的class结构,通过Class对象可以访问目标类的字段和方法
怎么加载?
加载方式
加载的工具
根类加载器C++,系统类加载器和扩展列加载器是java
Classloader类,将二进制名称转换成文件名,然后尝试着从文件系统读取该名称的.class文件
连接:
即本来用javac进行编译,但是有些人自己编译,生成的字节码文件不符合jvm对字节码文件的规范,因此需要检测
强调静态变量(static):此时对象还不存在,此时还不涉及实例方法。静态变量不属于某一个对象,是属于一个类的,所有的该类的对象都可以调用该静态变量。因此在该类加载到内存的时候,就可以给给静态变量分配内存了,并且初始化为默认值 boolean类型:false,int 类型:0等
【感觉像是一个屋子在规划的时候,就要划分好公共空间,之后要是有具体的别人住进来之后,可以根据不同人的不同的需求在各自的地方进行活动,但是公用的部分一定是在建设一始就划分好的,比如小区的公园和卫生间,并且要公园里面的花花草草给弄好,不能说就建了一个花园的大概的外围,里面什么都不搞,连地都不松一下土,这不行,还有比如卫生间,也是要把里面的设备搞齐全了,冲水的设备,纸篓都要放好,不能等业主进来了使用的时候才发现,“我擦,怎么什么都只是空样子”!至于后来小区业主进来了,可以在自己家里面再搞其他的花草什么的别人也管不了,】
解析:之后再说 /2015.04.29补充:这边的解析 是将符号饮用转换为直接引用,是多态中后期绑定的内容吗?
初始化:这个不和『连接』里面的『准备』重复吗?
不重复
因为此时是把用户想赋的值赋值给静态变量
举例:
解析完成,执行『初始化』:把3显示赋值给i;
new Test();
int b=Tetst.a;或者 Test.a=b;
Class.forName("classloader.Test");
来自为知笔记(Wiz)
相关文章推荐
- 1.索引、约束
- 尝试真正在VIM上开发项目
- Linux服务管理之httpd-2.2常用配置文件
- linux下的bash编程简要学习
- RecyclerView详解
- RecyclerView详解
- Perfect Squares
- [转]单表60亿记录等大数据场景的MySQL优化和运维之道
- CCSprite解析
- RecyclerView详解
- Android学习——Android单元测试
- 条款32:确定你的public继承塑模出is-a 关系(Make sure public inheritacne models "is-a")
- svn搭建
- Android 使用【AIDL】调用外部服务
- 【LeetCode】258 Add Digits
- 工厂模式之我见
- Node类源代码不完全分析
- SQL Server中的三种物理连接图文解析:Loop Join,Merge Join,Hash Join
- 10个实用的但偏执的Java编程技术
- 转载】Maven + SVN + Hudson 自动编译、部署、发布