java类的延迟初始化及其特性

jvm通过classLoader来加在编译生成class文件。来生成可操作的java类视图。

但是java并不是在一开始的时候就将会将程序中所有的class文件都加载起来。而是在需要的时候可以动态加载,这给java带来了更多的灵活性。像从网络的下载的class文件可以在程序运行的过程中动态的加载,或者运行时的安全的类型转换。这是c++这种静态编译语言所无法实现的。

当然动态加载也有其缺点,比如慢启动,运行的过程中对class文件的加载编译拖慢了整个程序的运行速度(相当于把部分编译时的工作转移到运行时来做这就是所谓的动态编译即 java jit),所以在程序运行一段时间后才能完全展示其性能。

下面的情况会触发class的load过程:

初始化一个类,包括执行这个类的静态初始化和初始化在这个类中声明的静态字段。根据java语言规范,在首次发生下列任意一种情况时,一个类或接口类型T将被立即初始化:

  • T是一个类,而且一个T类型的实例被创建;
  • T是一个类,且T中声明的一个静态方法被调用(初始化函数虽然未声明,但确实是一个静态函数,参自-java编程思想14章 类型信息);
  • T中声明的一个静态字段被赋值;
  • T中声明的一个静态字段被使用,而且这个字段不是一个常量字段;
  • T是一个顶级类(top level class,见java语言规范的§7.6),而且一个断言语句嵌套在T内部被执行。

未完.....待续

你可能感兴趣的:(java,jvm,编程,性能)