1.jvm 啟動流程
2.jvm基本結(jié)構(gòu)
pc寄存器: -每個線程擁有一個pc寄存器 -在線程創(chuàng)建時創(chuàng)建 -指向下一條指令的地址 -執(zhí)行本地方法時,,Pc的值為undefined (未定義的)
方法區(qū): 1.保存裝載的類信息 -類型的常量 -字段,方法信息 -方法字節(jié)碼 (jdk6:String等常量反正方法區(qū) jdk7:已經(jīng)將String等常量移到了) 2.通常和永久區(qū)關(guān)聯(lián)在一起
java堆: -和程序開發(fā)密切相關(guān) -應(yīng)用系統(tǒng)對象都保存在java堆中 -對分代的GC來說,,堆也是分代的 -GC的主要工作區(qū)間 復(fù)制算法
java棧: -線程私有 -棧由一系列幀組成(因此java棧也叫作幀棧) -幀保存一個方法的局部變量,操作數(shù)據(jù),,常量池指針 -每一次方法調(diào)用創(chuàng)建一個幀,并壓棧 –局部變量表包含參數(shù)和局部變量
– 函數(shù)調(diào)用組成幀棧
public static inttest(int a,int b, int c){ returntest(a,b,c); }
–Java沒有寄存器,,所有參數(shù)傳遞使用操作數(shù)棧
– 棧上分配: 小對象(一般幾十個bytes),,在沒有逃逸的情況下,可以直接分配在棧上 直接分配在棧上,,可以自動回收,,減輕GC壓力 大對象或者逃逸對象無法棧上分配
-棧、堆,、方法區(qū)交互
public class Personnel { private String name;
public Personnel(String name) { = name; }
public String getName() { return name; }
public void setName(String name) { = name; }
public void sysoName() { System.out.println(name); }
}
public class TestMain {
public static void main(String[] args) { Personnel a = new Personnel("testa"); Personnel b = new Personnel("testb");
a.sysoName(); b.sysoName(); } }
3.內(nèi)存模型 -每一個線程有一個工作內(nèi)存和主存獨立 -工作內(nèi)存存放主存中變量的值的拷貝
當(dāng)數(shù)據(jù)從主內(nèi)存復(fù)制到工作存儲時,,必須出現(xiàn)兩個動作:第一,由主內(nèi)存執(zhí)行的讀(read)操作,;第二,,由工作內(nèi)存執(zhí)行的相應(yīng)的load操作;當(dāng)數(shù)據(jù)從工作內(nèi)存拷貝到主內(nèi)存時,,也出現(xiàn)兩個操作:第一個,,由工作內(nèi)存執(zhí)行的存儲(store)操作;第二,,由主內(nèi)存執(zhí)行的相應(yīng)的寫(write)操作 每一個操作都是原子的,,即執(zhí)行期間不會被中斷 對于普通變量,一個線程中更新的值,不能馬上反應(yīng)在其他變量中
如果需要在其他線程中立即可見,,需要使用 volatile 關(guān)鍵字
基本結(jié)構(gòu)- 可見性:一個線程修改了變量,,其他線程可以立即知道 保證可見性的方法 -volatile -synchronized(解鎖之前,寫變量值回主存) -final 一旦初始化完成 其他線程可見
4編譯和解釋運行的概念 解釋運行: -解釋執(zhí)行以解釋方式運行字節(jié)碼 -意思是:讀一句執(zhí)行一句
編譯運行: -將字節(jié)碼編碼成機(jī)器碼 -直接執(zhí)行機(jī)器碼 -運行時編碼 -編譯后性能有數(shù)量級的提升
|