一、Java自動(dòng)內(nèi)存分配機(jī)制

一、Java的內(nèi)存模型

Java的內(nèi)存模型包括:
1.程序計(jì)數(shù)器:負(fù)責(zé)管理指令的執(zhí)行順序,并且因?yàn)樘摂M機(jī)的多線程是來回切換的。當(dāng)切換回來時(shí)需要記錄下上個(gè)線程的執(zhí)行狀態(tài)。所以每個(gè)線程都有一個(gè)程序計(jì)數(shù)器
2. 虛擬機(jī)棧區(qū):負(fù)責(zé)虛擬機(jī)方法模型的管理,每一個(gè)方法在里面都會(huì)形成一個(gè)棧幀,每個(gè)棧幀管理方法的內(nèi)存模型。會(huì)拋出OOP或者StackoverFlow錯(cuò)誤
3. native方法區(qū):負(fù)責(zé)管理c++的方法
4.Java堆區(qū):負(fù)責(zé)存放對(duì)象的實(shí)例,并且被線程所共享,虛擬機(jī)GC時(shí)處理的就是這個(gè)內(nèi)存塊。通過-Xms來控制
5.方法區(qū):用于加載已經(jīng)被系統(tǒng)處理的類信息,靜態(tài)信息,常量等信息。它包含一個(gè)運(yùn)行時(shí)常量池存儲(chǔ)類的信息
6.直接內(nèi)存:在Java1.4以后加入NIO,其中它的DirectBuffer可以直接在物理內(nèi)存中分配空間,并且在Jvm內(nèi)存中申請(qǐng)一塊內(nèi)存維護(hù)指向物理內(nèi)存的引用。通過操作這個(gè)引用來減少native和堆內(nèi)存間相互復(fù)制值產(chǎn)生的消耗

劉望舒的blog

二、new對(duì)象的過程

在new一個(gè)對(duì)象時(shí)
1.在運(yùn)行時(shí)常量池檢查是否加載,解析,初始化過
2.分配一塊空間給這個(gè)對(duì)象,如果堆的內(nèi)存規(guī)整使用指針碰撞,如果不規(guī)整采用引用列表
3.初始化歸零對(duì)象的值
4.調(diào)用init方法完成初始化

三、虛擬參數(shù)設(shè)置

將堆的最大最小參數(shù)設(shè)置一樣,可以避免堆自動(dòng)擴(kuò)展
-Xms:堆的最小參數(shù)
-Xmx:堆的最大參數(shù)
-Xss: 棧內(nèi)存容量設(shè)置
-XX:MaxPermSize:方法區(qū)最大容量
-XX:MaxDirectMemorySize:本機(jī)直接內(nèi)存

-verbose:gc  -Xms20M  -Xmx20M  -Xmn10M -XX:+PrintGCDetails 
XX:SurvivorRatio=8

四、線程能獲得的容量

一個(gè)方法能瓜分的內(nèi)存是:

操作系統(tǒng)分配的內(nèi)存 - Xmx - 方法區(qū)內(nèi)存 - 虛擬機(jī)進(jìn)程內(nèi)存 - 本地方法區(qū)
如果在方法中創(chuàng)建線程,那么上面的內(nèi)存由線程和棧瓜分,棧分配的越多,線程能創(chuàng)建的數(shù)量越小

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容