标签:load 资源 设置 ring 构造器 应用 produce strong 构造
JVM把class文件加载到内存里面,并对数据进行校验、准备、解析和初始化,最终能够被形成被JVM可以直接使用的Java类型的过程。
链接就是将Java类的二进制代码合并到java的运行状态中的过程。
初始化阶段是执行类构造器<clinit>()方法。在类构造器方法中,它将由编译器自动收集类中的所有类变量的赋值动作(准备阶段的a正是被赋值a)和静态变量与静态语句块static{}合并,初始化时机后续再聊。
正常使用。
GC把无用对象从内存中卸载。
1、类加载时机
当应用程序启动的时候,所有的类会被一次性加载吗?估计你早已知道答案,当然不能,因为如果一次性加载,内存资源有限,可能会影响应用程序的正常运行。那类什么时候被加载呢?例如,A a=new A(),一个类真正被加载的时机是在创建对象的时候,才会去执行以上过程,加载类。当我们测试的时候,最先加载拥有main方法的主线程所在类。
2、类初始化时机
主动引用(发生类初始化过程)
被动引用(不会发生类的初始化)
1 public class ClassLoaderProduce { 2 static int d=3; 3 static{ 4 System.out.println("我是ClassLoaderProduce类"); 5 } 6 public static void main(String [] args){ 7 int b=0; 8 String c="hello"; 9 SimpleClass simpleClass=new SimpleClass(); 10 simpleClass.run(); 11 } 12 } 13 14 class SimpleClass{ 15 static int a=3; 16 static{ 17 a=100; 18 System.out.println(a); 19 } 20 21 public SimpleClass(){ 22 System.out.println("对类进行加载!"); 23 } 24 25 public void run(){ 26 System.out.println("我要跑跑跑!"); 27 } 28 }
步骤一:装载ClassLoaderProduce类,在方法区生成动态数据结构(静态变量、静态方法、常量池、类代码),并且在堆中生成java.lang.Class对象;然后进行链接
步骤二:初始化:把static{}与静态变量合并存放在类构造器当中,对静态变量赋值。 1-5行执行完毕。
步骤三:执行main方法,首先在栈里面生成一个main方法的栈祯,定义变量b、c,注意此处的变量b、c存储的常量池存储的变量的地址,如图所示。
步骤四:创建SimpleClass对象;跟上面步骤类似:加载-链接-初始化。然后,调用run()方法的时候,它会通过classLoader局部变量的地址寻找到类的class对象并且调用run()方法
标签:load 资源 设置 ring 构造器 应用 produce strong 构造
原文地址:http://www.cnblogs.com/qiuyong/p/6407418.html