加载:这个阶段会在内存中生当作一个代表这个类的java.lang.Class对象,作为方式区这个类的各类数据进口。要注重的是这里纷歧定非要从一个Class文件获取,这里既可以从ZIP包中读取(好比jar包和war包中读取),也可以在运行时计较生当作(动态代办署理),也可以由其它文件生当作(好比将JSP文件转换当作对应的Class类)。
验证:这一阶段本家儿如果为了确保Class文件的字节省中包含的信息是否合适当前虚拟机的要求,而且不会风险虚拟机自身的平安。
筹办:正式为类变量分派内存并设置类变量的初始值阶段,即在方式区平分配这些变量所利用的内存空间。注重这里按图必然义,现实上变量v在筹办阶段事后的初始值为0而不是8080,将V赋值为8080的put static 指令是程序被编译后,存放于类机关器<client>方式之中。可是若是按图二声明,在编译阶段会为v生当作ConstantValue属性,在筹办阶段虚拟机遇按照ConstantValue属性将v赋值为80800
解析:虚拟机将常量池中的符号引用替代为直接引用的过程。符号引用就是
class文件中的:
1.CONSTANT_Class_info
2.CONSTANT_Field_info
3.CONSTANT_Method_info
等类型的常量。
初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自界说类加载器以外,其它操作都由JVM本家儿导。到了初始阶段,才起头真正执行类中界说的java程序代码。
类加载器: 虚拟机设计团队把加载动作放到JVM外部实现,以便让应用程序决议如何获取所需的类,JVM供给了3种类加载器:
1.启动类加载器:负责加载JAVA_HOME\lib目次中的,或经由过程-Xbootclasspath参数指定路径中的,且被虚拟机承认(按文件名识别,如rt.jar)的类。
2.扩展类加载器:负责加载JAVA_HOME\lib\ext目次中的,或经由过程java.ext.dirs系统变量指定路径中的类库。
3.应用程序类加载器:负责加载用户路径(classpath)上的类库。JVM经由过程双亲委派模子进行类的加载,当然我们也可以经由过程担当java.lang.ClassLoader实现自界说的类加载器。
双亲委派:当一个类收到类加载请求,他首先不会测验考试本身加载这个类,而是把这个请求委派给父类区完当作,每一个条理类加载器都是如斯,是以所有的加载请求都应该传动到启动类加载器中,只有当父类加载器反馈本身无法完当作这个请求的时辰(在它的加载路径下没有找到所需加载的Class),子类加载器才会测验考试本身去加载。
采用双亲委派的一个益处是好比加载位于rt.jar包中的类java.lang.object,不管是哪个加载器加载这个类,最终城市委托给顶层启动类加载器进行加载,这样包管了利用分歧的类加载器加载,最终获得的都是同样一个object对象。
OSGI(动态模子系统):面标的目的java的动态模子系统,是java动态化模块化系统的一系列规范。
OSGI描画了一个很夸姣的模块化开辟方针,并且界说了实现这个方针的所需要办事与架构,同时也有当作熟的框架进行实现撑持。但并非所有的应用都适合采用OSGI作为根本架构,它在供给壮大功能同时,也引入了额外的复杂度,因为它不遵守了类加载的双亲委托模子。
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!