0
点赞
收藏
分享

微信扫一扫

概述类的加载器及类加载过程


概述类的加载器及类加载过程_开发语言

  • 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头 有特定的文件标识。
  • ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。
  • 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包含字符串字面量(这部分常量信息是Class文件中常量池部分的内存映射)

概述类的加载器及类加载过程_开发语言_02

概述类的加载器及类加载过程_初始化_03

类的加载过程

概述类的加载器及类加载过程_初始化_04

概述类的加载器及类加载过程_加载_05

加载 

1、通过一个类的全限定名获取定义此类的二进制字节流

2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3、在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。

概述类的加载器及类加载过程_加载_06

链接

概述类的加载器及类加载过程_方法区_07

初始化

概述类的加载器及类加载过程_java_08

虚拟机保证一个类加载一次的代码演示

package chapter01.com.wust.yq;

public class DeadThreadTest {

public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始");
//这一步的目的就是为了加载类
DeadThread dt = new DeadThread();
System.out.println(Thread.currentThread().getName() + "结束");
}
};

Thread t1 = new Thread(r, "线程1");
Thread t2 = new Thread(r, "线程2");

t1.start();
t2.start();
}

}

class DeadThread {
static {
System.out.println(Thread.currentThread().getName() + "初始化当前类");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

结果展示 

概述类的加载器及类加载过程_加载_09


举报
0 条评论