对类加载的理解

1  使用类的准备包括三个基本过程: 加载,连接,初始化;

2  当使用类时,都会触发加载机制,但是不定会触发初始化(例如LOADCLASS方法和类字面常量),例如访问类的静态常量,通过子类访问类的父类定义的静态变量不会导致子类初始化。

3  类只会被初始化一次。

public class Single {


    static{
     System.out.println("st");

  }

 
public static void main(String[] args) throws ClassNotFoundException {

    for (int i = 0; i <3; i++) {
    
     new Single(); //打印一次

}   
   }


类的初始化实际上就是初始化静态值(静态代码块)。


4 以上所述所有内容与构造器初始化无关。仅仅是类使用前的准备。


5  使用类的时候才加载。加载后不一定初始化。初始化后不不代表产生对象。


6  加载PATH


System.out.println(System.getProperty("java.ext.dirs"));  根类加载器
System.out.println(System.getProperty("sun.boot.class.path"));  扩展类加载器
System.out.println(System.getProperty("java.class.path"));  系统类加载器,应用类加载器
 
/* C:\Program Files\Java\jre7\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
C:\Program Files\Java\jre7\lib\resources.jar;C:\Program Files\Java\jre7\lib\rt.jar;C:\Program Files\Java\jre7\lib\sunrsasign.jar;C:\Program Files\Java\jre7\lib\jsse.jar;C:\Program Files\Java\jre7\lib\jce.jar;C:\Program Files\Java\jre7\lib\charsets.jar;C:\Program Files\Java\jre7\classes
C:\Documents and Settings\Administrator\workspace\Java11\bin*/

7  非自定义CLASS LOADER加载的类都不会被卸载。自定义的可以被卸载


8  自定义类加载器表现为JAVA的一个对象,同样对于加载的类也是表现为一个对象。对象的实例更是对象。

In the Sun JVM, every object (except arrays) has a 2 words header. The first word contains the object's identity hash code plus some flags like lock state and age, and the second word contains a reference to the object's class. Also, any object is aligned to an 8 bytes granularity. This is the first rule or objects memory layout:

 

总体来看,Java bytecode是以解释方式被load到虚拟机的。但虚拟机的分析器根据一段运行,获知对程序效率影响最大的部分,然后通过动态编译,同时进行优化,编译成机器码,然后为接下来的运行加速。总的来说,HotSpot对bytecode有三层处理:不编译,编译,编译并优化。至于程序哪部分不编译,哪部分编译,哪部分做何种优化,则由Profile Monitor决定。

 

10 The Java Virtual Machine (JVM) loads the class files and either interprets the bytecode or just-in-time compiles it to machine code and then possibly optimizes it using dynamic compilation.






对类加载的理解_第1张图片

 

 

 

你可能感兴趣的:(java,虚拟机,object,Arrays,Class,reference)