- 類加載器子系統(tǒng)負(fù)責(zé)從文件系統(tǒng)或者網(wǎng)絡(luò)中加載Class文件,class文件在文件開頭?有特定的文件標(biāo)識(shí)。
- ClassLoader只負(fù)責(zé)class文件的加載,至于它是否可以運(yùn)行,則由Execution Engine決定。
- 加載的類信息存放于一塊稱為方法區(qū)的內(nèi)存空間。除了類的信息外,方法區(qū)中還會(huì)存放運(yùn)行時(shí)常量池信息,可能還包含字符串字面量(這部分常量信息是Class文件中常量池部分的內(nèi)存映射)
類的加載過程
加載?
1、通過一個(gè)類的全限定名獲取定義此類的二進(jìn)制字節(jié)流
2、將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)
3、在內(nèi)存中生成一個(gè)代表這個(gè)類的 java.lang.Class 對(duì)象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問入口。
鏈接
初始化
虛擬機(jī)保證一個(gè)類加載一次的代碼演示
package chapter01.com.wust.yq;
public class DeadThreadTest {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "開始");
//這一步的目的就是為了加載類
DeadThread dt = new DeadThread();
System.out.println(Thread.currentThread().getName() + "結(jié)束");
}
};
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() + "初始化當(dāng)前類");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
結(jié)果展示?
本文摘自 :https://blog.51cto.com/u