一、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)生的消耗

二、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ù)量越小