1. 程式人生 > >JVM學習筆記-記憶體管理

JVM學習筆記-記憶體管理

第一章 記憶體分配 1. 記憶體區域。     方法區和堆(執行緒共享),程式計數器 , VM棧 和 本地方法棧(執行緒隔離)。     1) java虛擬機器棧:執行緒私有。描述的是java方法執行的記憶體模型:棧幀,使用者儲存 區域性變量表,運算元棧,動態連結,方法出口等資訊。          區域性變量表在編譯時即可完全確定!如果執行緒請求的棧深度大於 規定的深度,StackOverflowError.     2) 本地方法棧,類似。     3)堆:垃圾收集器管理的主要區域。執行緒共享。     4)方法區: 各個執行緒共享。儲存:載入的類資訊,常量,靜態變數,即時編譯後的程式碼資料。習慣稱作:永久待。可以不選擇垃圾回收(特殊情況有必要)。          執行時常量池(屬於方法區),編譯時期的字面量和符號引用。執行期間可以將新的常量放入常量池:String.intern() 方法。     ‘ 2. 物件建立     1) new的執行: 首先,能否定位到一個類的符號引用,這個符號引用代表的類是否已被載入、解析和初始化。通過後,為新生物件分配記憶體,記憶體大小在類載入完後可確定。記憶體分配有兩種方式:指標碰撞和空閒列表。     物件頭:這個物件是哪個類的例項,如果找到類的元資料資訊,物件的雜湊碼,GC分代年齡等。     最後一步是init,按照程式設計師的意願進行初始化。     2) 物件的記憶體分佈:物件頭,例項資料,和對齊填充。     3)物件訪問的兩種方式:控制代碼訪問  和 直接指標訪問。棧中存放 reference引用 3. 棧溢位     1)如果執行緒請求的棧深度大於虛擬機器所允許的最大深度,StackoverflowError     2)如果虛擬機器在擴充套件棧時無法申請足夠記憶體,則 OutofMemoryError     JDK5.0以後每個執行緒堆疊大小為1M,以前每個執行緒堆疊大小為256K.更具應用的執行緒所需記憶體大小進行 調整.在相同實體記憶體下,減小這個值能生成更多的執行緒.但是作業系統對一個程序內的執行緒數還是有限制的,不能無限生成,經驗值在3000~5000左右一般小的應用, 如果棧不是很深, 應該是128k夠用的 大的應用建議使用256k。這個選項對效能影響比較大,需要嚴格的測試。 threadstacksize選項解釋很類似,官方文件似乎沒有解釋,在論壇中有這樣一句話:"-Xss is translated in a VM flag named ThreadStackSize”