標籤:決定 情境 常量 記憶體管理 技術 內容 fine 字串 垃圾收集器
- 虛擬機器運行時資料區
- 線程共用
- java Heap
- java heamp是java虛擬機器可組態管理的最大記憶體區;唯一的目的用於儲存執行個體對象,所有線程共用;
- GC堆,回收技術主要採用分代收集演算法;java Heap細分為:新生代、老生代;劃分本身與存放內容無關;無論怎麼劃分,都是為了更好的分配和回收記憶體;
- 邏輯上連續,物理上未必連續;
- 利用-Xms、-Xmx進行配置,無法分配及擴充時,將會拋出OutOfMerroyError錯誤;
- method area
- 儲存物件:虛擬機器載入的類資訊、常量、靜態變數、JIT編譯器編譯後的代碼
- alias name: Non-Heap
- HotSpot虛擬機器,Permanent Generation(永久代),實際上兩者並不等價,將GC擴充到方法區;
- 線程隔離
- native method stack
- program counter register
- 線程私人;
- java虛擬機器多線程通過線程輪流切換並分配處理器執行時間;
- 多線程輪流切換,必然需要在某刻恢複線程在上次執行的執行地址;例如一個線程在執行一個方法,計數器記錄就是線程執行的虛擬機器位元組碼指令的地址;如果是Native方法,那麼計數器的值為空白(undefined)
- 唯一一個無OutOfMemoryError的記憶體
- vms stack
- 直接記憶體
- direct memory, 並非是虛擬機器運行時資料區的一部分;
- NIO(new input/output), channel+buffer新型IO,利用Native函數庫直接分配堆外記憶體;利用儲存在java-heap中的DirectByteBuffer對象對該塊記憶體進行直接引用操作;優點是避免在java-heap和native-heap之間進行來回複製資料
- OutOfMerroyError錯誤;
- 對象
- 記憶體配置方式
- 指標碰撞(bump the pointer)---ParNew、Serial
- 空閑列表(Free List) --- CMS(Mark-Sweep)
- 決定條件
- 垃圾收集器是否帶有壓縮整理==>java-heap是否規整
- 記憶體配置策略
- 目的:解決衝突問題
- 方法一:CAS + 錯誤重試===>保證更新操作的原子性
- 方法二:線程在不同的空間預分配記憶體(java-heap),預分配記憶體稱之為TLAB(Thread Local Allocation Buffer),那個線程需要分配記憶體,就在那個線程的TLAB上分配,只有TLAB用光後分配新的TLAB時,才需要同步鎖定;虛擬機器是否使用TLAB,通過-XX:+/-UseTLAB參數配置;
- 記憶體布局
- header、Instance Data、Padding(對齊填充)
- header: 對象的HashCode\偏向線程ID\GC分代年齡\鎖狀態標誌\類型指標(對象指向它的類別中繼資料的指標)
- Padding無真實意義;保證資料長度是8位元組的整數倍
- Instance Data: 父類和子類可能會交叉儲存,較小的子類變數可能會插入到父類變數的空隙之中;相同長度的欄位總被分配到一起,如:shorts/chars、longs/doubles
- 對象訪問
- 控制代碼、直接指標
- 區別
- 控制代碼方式訪問資料 --- reference(控制代碼地址)-->控制代碼池(存放資料指標)--->對象指標-->資料
- 直接指標 ----reference(對象指標地址)-->對象指標-->資料
- JVM Error
- java-heap配置
- -Xms(堆最小), -Xmx(堆最大)
- 不可擴充:設定相同
- -XX:+HeapDumpOnOutOfMemoryError: 當出現記憶體溢出異常時,Dump出當前的記憶體堆的儲存快照
- 分類
- 堆溢出
- memory leak(記憶體泄露)
- memory overflow(記憶體溢出)
- 棧溢出(虛擬機器、本地方法)
- -Xss決定
- 出現情境
- 線程請求棧深度>虛擬機器允許深度 -->StackOverfolwError
- 虛擬機器在擴充棧時未申請到足夠記憶體 -->OutOfMemoryError
- 方法區、運行時常量池
- -XX:PermSize -XX:MaxPermSize
- String.intern(),Native方法,作用:如果常量池中有對應String對象,那麼返回;如果沒有,將對應的字串放入常量池;具體用法:String.ValueOf(i++).intern()
- 直接記憶體
- -XX:MaxDirectMemorySize,如果不指定,預設等於-Xmx取值相同
java虛擬機器記憶體管理