JVM學習筆記一:內存管理
參考資料
本文參考:《深入理解Java虛擬機》作者 周志明 知識產權歸作者所有
走近java- java組成部分:java語言、各平台虛擬機、Class文件結構、java api 類庫、第三方類庫
- Jre包括jvm和api
- java 未來展望:模塊化、混合語言、多核並行、豐富語法、64位虛擬機
自動內存管理機制
PC程序計數器PC:程序計數器,用於記錄和控制下一條需要執行的位元組碼的位置,分支、循環、跳轉、異常處理、線程恢復都需要依賴PC完成。 PC 是每個線程私有的,如果執行的是java方法,該值是位元組碼指令的地址,如果是native方法,該值是Undefined
Java虛擬機棧
JVM Stack 線程私有,用於存放棧幀 Frame 包括局部變數表、操作數棧、動態鏈接、方法出口等信息,如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常,如果Stack可以動態擴展,擴展到無法申請到足夠的內存時,拋出OutOfMemory"Error異常。-Xss 設置棧容量
Java堆Heap 堆是線程共享 用於分配對象實例 -Xms10m 初始大小 -Xmx20m 最大大小 也包括線程私有的分配緩衝區 TLAB 方法區 Method Area 線程共享 用於存儲被JVM載入的類信息、常量、靜態變數、JIT後的代碼,又叫做非堆 Non-Heap,永久代,-XX:PermSize=64M JVM初始分配的非堆內存,-XX:MetaspaceSize,class metadata的初始空間配額,以bytes為單位,jdk1.7,符號引用(Symbols)轉移到了native heap;字面量(interned strings)轉移到了java heap;類的靜態變數(class statics)轉移到了java heap;在JDK8中,classe metadata(the virtual machines internal presentation of Java class),被存儲在叫做Metaspace的native memory。
運行時常量池常量池是方法區的一部分,由Class文件解析後完成。
DirectMemory 或 Native MemoryJDK1.4引入的NIO可以使用Native函數直接分配堆外內存,然後通過DirectByteBuffer對象對這塊內存直接操作,避免了在Heap和NativeHeap直接來回複製數據,在設置-Xmx參數時要注意留出NativeMemory空間。
JDK1.6的intern方法把首次出現的字元串實例複製到永久代中,並返回已複製的實例引用
JDK1.7的intern方法不會再複製實例、而只是在常量池中記錄首次出現的實例引用,因此intern返回的引用和調用者是同一個引用。
創建對象分配內存方式:- 指針碰撞,移動已使用內存和空閑內存之間的指針,前提是已使用和空閑內存比較規整。
- 空閑列表,記錄可用內存塊及大小。
- 內存分配的同步問題:使用CAS + 失敗重試 保證內存分配的原子性,或利用TLAB,現在TLAB上分配,使用完分配新的TLAB時才需要同步
- 分配完成後內存空間全部初始化為零值
對象的內存布局
布局:對象頭Header、實例數據Instance Data 對齊填充 Padding 疑問:為什麼JVM對象地址要8位元組對齊?
對象頭包括MarkWord和類型指針,MarkWord 32bit or 64bit 包括哈希碼、GC分代年齡、鎖狀態標記、線程持有的鎖、偏向線程ID、偏向時間戳
類型指針是非必須的、以來虛擬機實現、如果是Java數組、對象頭還包括數組長度。
實例數據:父類變數在子類變數之前。CompactFields = true 子類較窄變數會插到父類變數的空隙之間。
對象的訪問定位- 使用句柄訪問:在Java堆中劃分出一塊內存做句柄池 reference中存儲的是對象的句柄地址,而句柄中包含了對象實例地址和類型數據地址
- 使用對象指針訪問:reference中存儲的是對象地址,需要考慮的是對象布局中如何放置訪問類型數據的指針
各種區域溢出現象
Java堆溢出 -XX:+HeapDumpOnOutOfMemoryError ava.lang.OutOfMemoryError: Java heap space 使用Eclipse Memory Analyzer 進行分析,內存泄露 查看泄露對象到GC Roots的引用鏈
Stack溢出 stack length unable to create new native thread
方法區和運行時常量池溢出 提示PermGen space
DirectMemory溢出時明顯的特徵是dump文件中看不見明顯的異常、文件很小,請檢查是否有NIO調用。
※從零自學Hadoop(24):Impala相關操作上
※JPA Advanced Mappings(映射)
※PHP將數據導出Excel表中
※web組件工具之獲取表單數據:webUtils
※第一章之s5pv210啟動順序
TAG:達人科技 |
※GPU學習筆記
※學習VR看VR學習筆記
※Git學習筆記(一)
※TRIZ創新理論學習筆記
※JT中醫基礎理論 筆記
※MRCP協議學習筆記-MRCP背景知識介紹
※中醫學習筆記
※HTTP協議學習筆記
※金融學習筆記Day 1
※OpenCV 學習筆記(一)認識 OpenCV
※中醫基礎理論學習筆記(純乾貨)
※Gradle插件學習筆記(一)
※課堂筆記:學業上我願做一個「Mad Men」
※華為HCNA學習筆記之——VRRP虛擬網關冗餘
※Python爬蟲學習筆記總結(一)
※Redis學習筆記之基本數據結構
※每日一記:Python 函數學習筆記1
※Python爬蟲學習筆記總結(二)
※學習筆記:人工智慧基礎-機器學習(一)
※KRENZ場景光影學習筆記1