走進Java
JDK
JDK(Java Development Kit)是用于支持Java程序開發(fā)的最小環(huán)境讹剔,包括 Java程序設計語言沙郭、Java虛擬機、Java API類庫柒室。
JRE
JRE(Java Runtime Enviroment)是支持Java程序運行的標準環(huán)境,包括Java SE API子集和Java虛擬機仙辟。
Java內(nèi)存區(qū)域劃分
程序計數(shù)器(Program Counter Register) 是一塊較小的內(nèi)存空間,它可以看做是當前線程所執(zhí)行的字節(jié)碼的行號指示器鳄梅。每個線程有一個私有的程序計數(shù)器叠国,所以屬于線程私有的內(nèi)存。
Java虛擬機棧(Java Virtual Machine Stack )也是線程私有的戴尸,他的生命周期與線程相同粟焊。每個方法在執(zhí)行的時候都會創(chuàng)建一個棧幀(Stack Frame)用于儲存局部變量表、操作數(shù)棧孙蒙、動態(tài)鏈接项棠、方法出口等信息。一個方法的執(zhí)行到結(jié)束马篮,都對應著一個棧幀在虛擬機棧的入棧和出棧沾乘。
本地方法棧 與虛擬機棧相似怜奖,只是對應于Native方法浑测。
方法區(qū)(Method Area) 是線程共享區(qū)域,它用來儲存已被虛擬機加載的類信息、常量迁央、靜態(tài)變量掷匠、即時編譯器編譯后的代碼等數(shù)據(jù)。
堆 用來存放Java對象
垃圾回收與內(nèi)存分配策略
對象存活判定算法
引用記數(shù)算法不能解決循環(huán)引用的問題岖圈。Java采用可達性分析算法(Reachablity Analysis)來判定對象是否存活讹语。
可作為GC Roots的對象包括下面幾種:
- 虛擬機棧中引用的對象
- 方法區(qū)中靜態(tài)屬性引用的對象
- 方法區(qū)中常量引用的對象
- 本地方法棧中JNI引用的對象
垃圾回收算法
-
標記-清理算法(Mark-Sweep)
效率問題和內(nèi)存碎片問題 -
復制算法
不會有內(nèi)存碎片,只用對半個區(qū)進行回收蜂科,但內(nèi)存縮小到一半顽决。商業(yè)虛擬機大部分采用這種算法。一個Eden兩個Survivor导匣,大小8:1才菠。缺點,老年代浪費效率贡定。 -
標記-整理算法(Mark-Compact)
對于老年代比較合適赋访,只需移動部分存活對象填補內(nèi)存空缺。
垃圾收集器
G1(Garbage-First)收集器是當今技術(shù)發(fā)展的最前沿成果之一缓待。它是一款面向服務器應用的垃圾收集器蚓耽。他的特點如下:
- 并行與并發(fā)
可利用多CPU、多核環(huán)境下的硬件優(yōu)勢旋炒,使用多個CPU縮短Stop-the-world停頓的時間步悠。 - 分代收集
- 空間整合
- 可預測的停頓
內(nèi)存分配策略
- 對象優(yōu)先在Eden分配
- 大對象直接進入老年代
- 長期存活的對象將進入老年代