內(nèi)存管理
- Java棧區(qū)(內(nèi)存管理中最重要的模塊)
作用: 它存放的是Java方法執(zhí)行時的所有的數(shù)據(jù)
棧區(qū)由棧幀組成晶丘,一個棧幀代表一個方法的執(zhí)行
這就解釋了為什么棧可以完整的描述java中的方法嵌套調(diào)用
-
Java棧幀
作用:每個方法從調(diào)用到執(zhí)行完成就對應(yīng)一個棧幀在虛擬機(jī)棧中入棧到出棧的一個過程
舉個栗子:
比如A方法運行時要調(diào)用B方法,在A方法中執(zhí)行到調(diào)用B的那條語句時塔次,Java虛擬機(jī)會創(chuàng)建一個保存B方法的一個棧幀益缎,然后被壓入Java棧區(qū)中遇伞,當(dāng)B方法執(zhí)行完之后掂名,棧幀從Java棧區(qū)中彈出据沈。棧幀主要包括:
- 局部變量表
- 棧操作數(shù)
- 動態(tài)鏈接
- 方法出口
異常 stackoverflow 就是在棧區(qū)中出現(xiàn)的,出現(xiàn)的原因:當(dāng)棧的深度大于JVM所允許的最大深度時
模擬異常饺蔑,寫一個沒有退出的遞歸函數(shù)
public class Digui { public static void main(String[] args){ System.out.println("輸入一個整數(shù):"); Scanner scan = new Scanner(System.in); int x = scan.nextInt(); judgePrime(x); } static void judgePrime(int n) { judgePrime(n+1); } }
會產(chǎn)生異常
Exception in thread "main" java.lang.StackOverflowError
-
本地方法棧
本地方法棧是專門為native方法服務(wù)的
-
方法區(qū)
作用:存儲被虛擬機(jī)加載的類信息锌介、常量、靜態(tài)變量猾警、即時編譯器編譯后等數(shù)據(jù)
特點:主要存儲編譯期所要保存的信息孔祸,永遠(yuǎn)占據(jù)內(nèi)存
-
堆區(qū)
作用:所有通過new創(chuàng)建的對象的內(nèi)存都在堆中分配
特點:是虛擬機(jī)中最大的一塊內(nèi)存,是GC要回收的部分
堆區(qū)內(nèi)容分配:
新生代:新建的對象都是用新生代分配內(nèi)存
舊生代:用于存放新生代中經(jīng)過多次垃圾回收仍然存活的對象
當(dāng)Eden空間不足的時候发皿,java虛擬機(jī)會通過一系列的算法和規(guī)則崔慧,會把存活的對象轉(zhuǎn)移到老生代區(qū),當(dāng)新生代和老生代都沒有足夠的存儲時穴墅,這個時候JVM會拋出OOM異常惶室,并且垃圾回收器會重點回收新生代和老生代的內(nèi)存區(qū)域
開發(fā)人員可以根據(jù)自己項目的需求去動態(tài)的調(diào)整新生代和老生代的區(qū)域大小。
舉個栗子
在做即時通信的應(yīng)用時玄货,因為臨時消息會比較多皇钞,所以可以將新生代的區(qū)域調(diào)大,老生代的區(qū)域調(diào)小松捉,這樣便于內(nèi)存的分配夹界,加快對象的創(chuàng)建。如果開發(fā)大型服務(wù)類程序時惩坑,可以將新生代的區(qū)域調(diào)小掉盅,老生代的區(qū)域調(diào)大,達(dá)到對象常駐內(nèi)存的效果以舒,增加服務(wù)器的穩(wěn)定性趾痘。