java类在什么时候才会加载(java中静态内部类什么时候加载)
大家好,今天给各位分享java类在什么时候才会加载的一些知识,其中也会对java中静态内部类什么时候加载进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
java中静态内部类什么时候加载
只有在加载内部类的时候才初始化
看懂以下的代码,那么对于类的加载,基本上就没问题了,最后类的加载过程的解释
public class Test6{
public static void main(String[] args){
new B();
new A.C();
}
}
class A{
private P p1= new P("A--p1");
static P p3= new P("A--p3");
public A(){
System.out.println("A()");
}
private P p2=new P("A--p2");
static{
new P("A--static");
}
{new P("A{...}");}
public static class C{
private P p1= new P("C--p1");
static P p3= new P("C--p3");
public C(){
System.out.println("C()");
}
private P p2=new P("C--p2");
static{
new P("C--static");
}
{new P("C{...}");}
}
}
class B extends A{
private P p1= new P("B--p1");
static P p3= new P("B-- p3");
public B(){
System.out.println("B()");
}
public P p2= new P("B-- p2");
static{
new P("B-- static");
}
{new P("B{...}");}
}
class P{
public P(String s){
System.out.println(s);
}
}
/*
有父类的情况
1.加载父类
1.1为静态属性分配存储空间并赋初始值
1.2执行静态初始化块和静态初始化语句(从上至下)
2.加载子类
2.1为静态属性分配存储空间
2.2执行静态初始化块和静态初始化语句(从上至下)
3.加载父类构造器
3.1为实例属性分配存数空间并赋初始值
3.2执行实例初始化块和实例初始化语句
3.3执行构造器内容
4.加载子类构造器
4.1为实例属性分配存数空间并赋初始值
4.2执行实例初始化块和实例初始化语句
4.3执行构造器内容
5回到main()
内部类的加载过程也一样
Java中的类是什么时候被加载到虚拟机
这个问题java的比较核心的一个难题,我就针对问题做简要回答,不做深入讨论了:
1、编译和运行概念要搞清:编译即javac的过程,负责将.java文件compile成.class文件,主要是类型、格式检查与编译成字节码文件,而加载是指java*的过程,将.class文件加载到内存中去解释执行,即运行的时候才会有加载一说。
2、类的加载时机,肯定是在运行时,但并不是一次性全部加载,而是按需动态,依靠反射来实现动态加载,一般来说一个class只会被加载一次,之后就会从jvm的class实例的缓存中获取,谁用谁取就可以了,不会再去文件系统中加载.class文件了。
明白1,2点就够了,再深入要等一段才能明白了。
class 类 什么 时候被 加载 java虚拟机内存
编写的java文件经过编译之后形成字节码文件,当你的程序在运行中调用到该class类的时候,通过ClassLoader进行加载。下面详细介绍下。
class文件从加载到jvm内存中开始,到卸载出内存为止,他的整个生命周期(整个加载过程)包括:加载,验证,准备,解析,初始化,使用和卸载。其中验证,准备,解析三个合称为连接。下面重点说一下加载过程。
加载过程:
1、通过一个类的全限定名来获取定义此类的二进制字节流
2、将字节流所代表的静态存储结构转化为方法区的运行时存储结构
3、在java堆中生成一个代表该类的对象,作为方法区这些数据的访问入口
验证:
1、文件格式验证:是否以魔数0xCAFEBABE开头,class文件的主次版本号是否在当前jvm处理范围之内,常量池的常量中是否有不被支持的类型,指向常量中的索引值有无不存在的常量,等
2、元数据验证:对字节码描述的信息进行语义分析,保证符合java规范。如是否有父类,是否继承了不允许继承的类,如果不是抽象类,是否实现了所有未实现的方法。等
3、字节码验证:数据流和控制流分析。主要针对类的方法体。
4、符号引用验证:如符号引用中通过字符串描述的全限定名是否能够找到对应的类等
准备:
该阶段正式为类变量分配内存并设置初始值。内存在方法区中分配。这里说的初始值是通常情况下说的零值。
解析:
虚拟机将常量池中的符号引用替换为直接引用的过程。包括:
1、类或接口的解析
2、字段解析
3、类方法解析
4、接口方法解析
初始化:
类初始化阶段是类加载过程的最后一步,除了加载阶段用户可以通过自定义加载器参与外,其余动作完全由虚拟机指导控制。到了初始化阶段,才真正开始执行类中定义的java程序代码(字节码)。在准备阶段,变量已经赋过一次系统默认值,而在初始化阶段,则是根据程序制定的主观计划去初始化类变量和其他资源,即初始化阶段是执行类构造器<clinit>()方法的过程。<clinit>是在编译java源码时,按照静态块和静态变量赋值语句的顺序生成的。如果类没有静态块也没有为静态变量赋值,就不会生成<clinit>方法,该方法只能被虚拟机调用。
java的类加载后什么时候会被释放
java的类加载后且当使用阶段完成之后,java类就进入了卸载阶段,也就是所谓的释放。
使用阶段包括主动引用和被动引用,主动饮用会引起类的初始化,而被动引用不会引起类的初始化。
一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况,如图所示:
PS:关于类的卸载,在类使用完之后,如果满足下面的情况,类就会被卸载:
该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。
java类在什么时候才会加载的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中静态内部类什么时候加载、java类在什么时候才会加载的信息别忘了在本站进行查找哦。