一、Java的內(nèi)存模型
Java的內(nèi)存模型包括:
1.程序計數(shù)器:負(fù)責(zé)管理指令的執(zhí)行順序街州,并且因為虛擬機的多線程是來回切換的兼丰。當(dāng)切換回來時需要記錄下上個線程的執(zhí)行狀態(tài)。所以每個線程都有一個程序計數(shù)器
2. 虛擬機棧區(qū):負(fù)責(zé)虛擬機方法模型的管理唆缴,每一個方法在里面都會形成一個棧幀鳍征,每個棧幀管理方法的內(nèi)存模型。會拋出OOP或者StackoverFlow錯誤
3. native方法區(qū):負(fù)責(zé)管理c++的方法
4.Java堆區(qū):負(fù)責(zé)存放對象的實例面徽,并且被線程所共享艳丛,虛擬機GC時處理的就是這個內(nèi)存塊。通過-Xms來控制
5.方法區(qū):用于加載已經(jīng)被系統(tǒng)處理的類信息,靜態(tài)信息氮双,常量等信息旺聚。它包含一個運行時常量池存儲類的信息
6.直接內(nèi)存:在Java1.4以后加入NIO,其中它的DirectBuffer可以直接在物理內(nèi)存中分配空間眶蕉,并且在Jvm內(nèi)存中申請一塊內(nèi)存維護指向物理內(nèi)存的引用。通過操作這個引用來減少native和堆內(nèi)存間相互復(fù)制值產(chǎn)生的消耗
二唧躲、new對象的過程
在new一個對象時
1.在運行時常量池檢查是否加載造挽,解析,初始化過
2.分配一塊空間給這個對象弄痹,如果堆的內(nèi)存規(guī)整使用指針碰撞饭入,如果不規(guī)整采用引用列表
3.初始化歸零對象的值
4.調(diào)用init方法完成初始化
三、虛擬參數(shù)設(shè)置
將堆的最大最小參數(shù)設(shè)置一樣肛真,可以避免堆自動擴展
-Xms:堆的最小參數(shù)
-Xmx:堆的最大參數(shù)
-Xss: 棧內(nèi)存容量設(shè)置
-XX:MaxPermSize:方法區(qū)最大容量
-XX:MaxDirectMemorySize:本機直接內(nèi)存
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails
XX:SurvivorRatio=8
四谐丢、線程能獲得的容量
一個方法能瓜分的內(nèi)存是:
操作系統(tǒng)分配的內(nèi)存 - Xmx - 方法區(qū)內(nèi)存 - 虛擬機進程內(nèi)存 - 本地方法區(qū)
如果在方法中創(chuàng)建線程,那么上面的內(nèi)存由線程和棧瓜分蚓让,棧分配的越多乾忱,線程能創(chuàng)建的數(shù)量越小