标签:style blog http ar color 使用 sp for java
调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区。当系统出现以下几种情况时,JVM进程将被终止:
当程序主动使用某个类时,如果该类还没有被加载到内存中,系统会通过加载、连接、初始化这三个步骤来对该类进行初始化(如果没有意外,JVM将会连续完成这三个步骤,所以有时也会把这三个步骤统称为类的加载或初始化)。
类的加载是指将类的class文件读入内存,并为之创建一个java.lang.Class对象(注意并不是目标类的对象)。也就是说当程序中使用任何类时都会为之创建一个java.lang.Class对象。
类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是Java程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。
通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种数据来源:
java通常无需等到“首次使用”该类时才加载该类,Java虚拟机允许系统预先加载某些类。
当类被加载后,系统会为之生成一个对应的Class对象,接着就会进入类的连接阶段。
类的连接阶段负责把类的二进制数据合并到JRE中。类的连接又可以分为如下三个阶段:
在类的初始化阶段,虚拟机负责对类进行初始化,主要是对静态属性进行初始化。在java类中对静态属性进行初始化有两种方式:
进行初始化时,JVM会按语句在程序中的排列顺序依次执行初始化。如下面的代码,最终b的值为9。
package com.zhyea.test; public class Test { static{ b=6; } static int a = 0; static int b = 9; }
JVM对类进行初始化时包含如下步骤:
根据如上步骤可以看出来,当程序主动使用任何一个类时,系统会保证该类以及所有父类都会被初始化。
系统开始初始化类或接口的时间包括一下6种情况:
需要一提的是final修饰的静态属性,如final修饰的静态属性在编译时就得到了属性值,那么该静态属性就会被当作常量不会被初始化(类的编译做了哪些事情呢,这里需要考虑下)。如下面这种情况:
final static int MON = 1;
final修饰的静态属性未能在编译时得到属性值,那么就会被初始化,如下面这种情况:
final static int TUE = 1+1;
还值得一提的就是ClassLoader的loadClass方法并不会执行类的初始化,而是只执行了类的加载。
标签:style blog http ar color 使用 sp for java
原文地址:http://www.cnblogs.com/amunote/p/4170627.html