中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

          Java專(zhuān)題文章博客和開(kāi)源

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          Java自動(dòng)內(nèi)存管理機(jī)制

            Java內(nèi)存區(qū)域
           
             java虛擬機(jī)在執(zhí)行java程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分成很多個(gè)不同的數(shù)據(jù)區(qū)域。這些區(qū)域都有各自的用途,以及創(chuàng)建和銷(xiāo)毀的時(shí)間,有的區(qū)域隨著虛擬機(jī)進(jìn)程的啟動(dòng)而存在,有些區(qū)域則是依賴(lài)用戶(hù)線(xiàn)程的啟動(dòng)和結(jié)束而建立和銷(xiāo)毀。Java虛擬機(jī)規(guī)范中把java虛擬機(jī)所管理的內(nèi)存劃分為以下幾個(gè)區(qū)域。托福答案
           
             一、程序計(jì)數(shù)器(Program Counter Register)
           
             程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,它的作用是當(dāng)前所執(zhí)行的字節(jié)碼的行號(hào)指示器。它是線(xiàn)程私有的,即各個(gè)線(xiàn)程都有獨(dú)立的程序計(jì)數(shù)器。
           
             如果線(xiàn)程正在 執(zhí)行一個(gè)java方法,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是native方法,則這個(gè)計(jì)數(shù)器是空(undefined)。
           
             此內(nèi)存區(qū)域是唯一的一個(gè)不會(huì)拋出OutOfMemoryError異常的區(qū)域。
           
             二、java虛擬機(jī)棧(Java Virtual Machine Stacks)
           
             我們可能經(jīng)常聽(tīng)到說(shuō)java內(nèi)存分為堆內(nèi)存和棧內(nèi)存,其實(shí)這個(gè)說(shuō)法中的棧內(nèi)存是指java虛擬機(jī)棧中的局部變量表部分。
           
             Java虛擬機(jī)棧描述的是java方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行時(shí)都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀(Stack Frame),用于存儲(chǔ)局部變量表、操作棧、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法被調(diào)用直到執(zhí)行完成的過(guò)程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過(guò)程。Java虛擬機(jī)棧也是線(xiàn)程私有的,生命周期也線(xiàn)程相同。
           
             局部變量表存放的類(lèi)型包括以下三種:
           
             1、 編譯期可知的基本數(shù)據(jù)類(lèi)型:boolean、byte、char、short、int、float、long、double共8 種類(lèi)型;
           
             2、 對(duì)象引用:即reference類(lèi)型,它存放的是一個(gè)指向堆中對(duì)象起始地址的引用指針,或一個(gè)代表對(duì)象的句柄或者其他與此對(duì)象相關(guān)的位置,根據(jù)虛擬機(jī)的不同實(shí)現(xiàn)而不同;
           
             3、 returnAddress類(lèi)型:存放指向一條字節(jié)碼指令的地址;
           
             局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個(gè)方法時(shí),這個(gè)方法需要在幀中分配多大的局部變量表空間是完全確定了的,方法在運(yùn)行期間不會(huì)改變局部變量表的大小。
           
             Java虛擬機(jī)棧會(huì)拋出兩種異常:
           
             1、 OutOfMemoryError異常:如果虛擬本可以動(dòng)態(tài)擴(kuò)展,當(dāng)擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存時(shí)拋出;
           
             2、 StackOverflowError異常:如果線(xiàn)程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度時(shí)拋出;
           
             三、本地方法棧(Native Method Stacks)
           
             本地方法棧與虛擬機(jī)棧的作用相似,它是為虛擬機(jī)在執(zhí)行native方法時(shí)服務(wù),而虛擬機(jī)棧是為虛擬機(jī)執(zhí)行java方法服務(wù)。此內(nèi)存區(qū)域也會(huì)拋出OutOfMemoryError異常和StackOverflowError異常。
           
             四、java堆(Java Heap)
           
             java堆是用于存放對(duì)象實(shí)例和數(shù)組。它是java虛擬機(jī)管理的內(nèi)存中最大的一塊,被所有線(xiàn)程共享,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建,也是垃圾收集器管理的要區(qū)域,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存。
           
             如果垃圾收集器采用的是分代收集它還,它還可以細(xì)分為新生代和老年代,再細(xì)致一點(diǎn)的有Enden空間、From Survivor空間、To Survivor空間等。
           
             java堆可以處理物理上不連續(xù)的內(nèi)存空間中,只要邏輯上連續(xù)即可。在實(shí)現(xiàn)時(shí)既可以實(shí)現(xiàn)豐固定大小的,也可以是可擴(kuò)展的。如果是可擴(kuò)展的,可以通過(guò)-Xms和-Xmx來(lái)指定最小和最大值,如果-Xms和-Xmx的值相等,則相當(dāng)于不可擴(kuò)展了。如果堆中沒(méi)有內(nèi)存可完成實(shí)例分配,此內(nèi)存區(qū)域會(huì)拋出OutOfMemoryError異常。托福答案
           
             五、方法區(qū)
           
             方法區(qū)用于存放已被虛擬機(jī)加載的類(lèi)信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。它是堆的一個(gè)邏輯部分,是各個(gè)線(xiàn)程共享的內(nèi)存區(qū)域。如果是sun的HotSpot虛擬機(jī),它也叫做永久代(Permanent Generation),如果方法區(qū)無(wú)法滿(mǎn)足內(nèi)存分配需求時(shí),會(huì)拋出OutOfMemoryError異常。托福改分
           
             方法區(qū)中的運(yùn)行時(shí)常量池(RuntimeConstant Pool),用于存放編譯期生成的各種字面量和符號(hào)引用,它在類(lèi)加載后存放到運(yùn)行時(shí)常量池中。
           
             運(yùn)行時(shí)常量池具有動(dòng)態(tài)性,即常量不一定只在編譯期產(chǎn)生,在運(yùn)行期間也可能將新的常量存入池中,比如String類(lèi)的intern()方法。
           
             六、直接內(nèi)存(DirectMemory)
           
             它不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。比如在JDK1.4中新加入的NIO類(lèi),有一種基于通道與緩沖區(qū)的I/O方式,它可以使用native函數(shù)庫(kù)直接分配堆外內(nèi)存,然后通過(guò)一個(gè)存儲(chǔ)在java堆中的DirectByteBuffer對(duì)象作為這塊內(nèi)存的引用進(jìn)行操作。所以直接內(nèi)存不會(huì)受到j(luò)ava堆大小的限制,但會(huì)受到本機(jī)總內(nèi)存的大小及處理器尋址空間的限制。它也會(huì)拋出OutOfMemoryError異常。
           
           

          posted on 2013-10-08 19:40 好不容易 閱讀(133) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          PK10開(kāi)獎(jiǎng) PK10開(kāi)獎(jiǎng)
          主站蜘蛛池模板: 观塘区| 凭祥市| 黄陵县| 郎溪县| 勐海县| 商丘市| 芦山县| 九江市| 惠水县| 平武县| 江孜县| 台中县| 仲巴县| 绿春县| 汉寿县| 台江县| 广河县| 石屏县| 德庆县| 南靖县| 右玉县| 古蔺县| 漳平市| 黄龙县| 靖安县| 镇原县| 无棣县| 卓资县| 镇坪县| 磐石市| 从化市| 酉阳| 文山县| 玉屏| 乌拉特中旗| 论坛| 霍城县| 嘉鱼县| 镇原县| 大化| 千阳县|