JVM学习笔记(二)

197 阅读3分钟

1、类加载机制的概念。
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制。Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能,这里就是我们经常能见到的Class类。

2、类文件字节码由哪几部分组成。
http://www.importnew.com/24088.html

    3.1 魔数
    3.2 版本号
    3.3 常量池
    3.4 Access_Flag 访问标志
    3.5 类索引
    3.6父类索引
    3.7 接口索引
    3.8 字段表集合
    3.9 方法

3、类加载过程大体分为几步。
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(using)、和卸载(Unloading)七个阶段。其中验证、准备和解析三个部分统称为连接(Linking),这七个阶段的发生顺序如下图所示:

各个阶段具体过程: http://blog.csdn.net/fgets/article/details/52934178 http://blog.csdn.net/u011080472/article/details/51329315

4、什么时机发生类加载。 http://blog.csdn.net/liang_70121385/article/details/52496028

5、类的初始化

    1.类从顶至底的顺序初始化,所以声明在顶部的字段的早于底部的字段初始化
    2.超类早于子类和衍生类的初始化
    3.如果类的初始化是由于访问静态域而触发,那么只有声明静态域的类才被初始化,而不会触发超类的初始化或者子类的
    4.初始化即使静态域被子类或子接口或者它的实现类所引用。
    5.接口初始化不会导致父接口的初始化。
    6.静态域的初始化是在类的静态初始化期间,非静态域的初始化时在类的实例创建期间。这意味这静态域初始化在非静态域之前。
    7.非静态域通过构造器初始化,子类在做任何初始化之前构造器会隐含地调用父类的构造器,他保证了非静态或实例变量(父类)初始化早于子类

6、类加载器和双亲委派模型
http://www.importnew.com/25295.html 委托机制的意义 — 防止内存中出现多份同样的字节码

能不能自己写个类叫java.lang.System?

答案:不可以,会由父类加载器加载jdk中的java.lang.System。 解释:如果用自定义类加载器强行加载特殊目录的以java.开头的类会报SecurityException。

但是,我们可以自己定义一个类加载器来达到这个目的,为了避免双亲委托机制,这个类加载器也必须是特殊的。由于系统自带的三个类加载器都加载特定目录下的类,如果我们自己的类加载器放在一个特殊的目录,那么系统的加载器就无法加载,也就是最终还是由我们自己的加载器加载。

http://www.cnblogs.com/lanxuezaipiao/p/4138511.html