静态代码块随着类的加载而加载
创建一个对象或者访问一个类的静态成员时,一定会加载该类
同一个类中多次创建该类或者访问该类的静态成员为什么只会加载一次?
而不同的类没次访问都会加载一次?
内存中不是以已经有了该类的字节码对象,为什么还会去加载
JVM只有一个,类的符号引用已经有了 不同的类new为什么又会去加载
JDK7后常量池在堆中,而堆又是线程共享的 JVM只有一个,那么堆也只有一个,常量池也是一个,共享,难道其他的类不知道常量池中已经有了该类的符号引用吗?
静态代码块随着类的加载而加载
创建一个对象或者访问一个类的静态成员时,一定会加载该类
同一个类中多次创建该类或者访问该类的静态成员为什么只会加载一次?
而不同的类没次访问都会加载一次?
内存中不是以已经有了该类的字节码对象,为什么还会去加载
JVM只有一个,类的符号引用已经有了 不同的类new为什么又会去加载
JDK7后常量池在堆中,而堆又是线程共享的 JVM只有一个,那么堆也只有一个,常量池也是一个,共享,难道其他的类不知道常量池中已经有了该类的符号引用吗?
JVM将类加载过程分为:加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载。
加载过程中会先检查类是否被已加载,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。在虚拟机的生命周期中一个类只被加载一次。
类加载的时机:
1)第一次创建对象要加载类.
2)调用静态方法时要加载类,访问静态属性时会加载类。
3)加载子类时必定会先加载父类。
4)创建对象引用不加载类.
5) 子类调用父类的静态方法时
6)访问静态常量,如果编译器可以计算出常量的值,则不会加载类
new 如果没有当然回去加载,如果有了,那就不会去加载。而是去初始化了。静态初始化是属于类加载的过程,所以它只执行一次,而实例初始化是每个对象创建时都会执行一次。