java内存分配空间大小,JVM内存模型及内存分配过程
一、JVM內(nèi)存模型
JVM主要管理兩種類型內(nèi)存:堆(Heap)和非堆(Permanent區(qū)域)。
1、Heap是運(yùn)行時(shí)數(shù)據(jù)區(qū)域,所有類實(shí)例和數(shù)組的內(nèi)存均從此處分配。Heap區(qū)分兩大塊,一塊是 Young Generation,另一塊是Old Generation:
1)在Young Generation中,有一個(gè)叫Eden Space的空間,主要是用來存放新生的對象,還有兩個(gè)Survivor Spaces(from,to),它們的大小總是一樣,它們用來存放每次垃圾回收后存活下來的對象。
2)在Old Generation中,主要存放應(yīng)用程序中生命周期長的內(nèi)存對象。
2、Permanent區(qū):
Permanent Generation,主要是存儲(chǔ)的是java的類信息,包括解析得到的方法、屬性、字段等等。永久帶基本不參與垃圾回收。Permanent generation 不是Heap的一部。
.
二、內(nèi)存大小
1、Heap內(nèi)存分配
JVM初始分配的內(nèi)存由-Xms指定,默認(rèn)是物理內(nèi)存的1/64;
JVM最大分配的內(nèi)存由-Xmx指 定,默認(rèn)是物理內(nèi)存的1/4。
默認(rèn)空余堆內(nèi)存小于40%時(shí),JVM 就會(huì)增大堆直到-Xmx 的最大限制,可以由 -XX:MinHeapFreeRatio 指定。
默認(rèn)空余堆內(nèi)存大于70%時(shí),JVM 會(huì)減少堆直到-Xms的最小限制,可以由 -XX:MaxHeapFreeRatio 指定,
2、Permanent區(qū)域內(nèi)存分配
JVM使用-XX:PermSize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64;
由XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4。
三、JVM內(nèi)存分配過程
1、JVM 會(huì)試圖為相關(guān)Java對象在Eden中初始化一塊內(nèi)存區(qū)域。
2、當(dāng)Eden空間足夠時(shí),內(nèi)存申請結(jié)束;否則到下一步。
3、JVM 試圖釋放在Eden中所有不活躍的對象(這屬于1或更高級的垃圾回收)。釋放后若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區(qū)。
4、Survivor區(qū)被用來作為Eden及Old的中間交換區(qū)域,當(dāng)Old區(qū)空間足夠時(shí),Survivor區(qū)的對象會(huì)被移到Old區(qū),否則會(huì)被保留在Survivor區(qū)。
5、當(dāng)Old區(qū)空間不夠時(shí),JVM 會(huì)在Old區(qū)進(jìn)行完全的垃圾收集(0級)。
6、完全垃圾收集后,若Survivor及Old區(qū)仍然無法存放從Eden復(fù)制過來的部分對象,導(dǎo)致JVM無法在Eden區(qū)為新對象創(chuàng)建內(nèi)存區(qū)域,則出現(xiàn)”out of memory”錯(cuò)誤。
參考:
總結(jié)
以上是生活随笔為你收集整理的java内存分配空间大小,JVM内存模型及内存分配过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩尔庄园服装贩卖机在哪
- 下一篇: 飞驰多少钱啊?