<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術平等自由協作創造

    Java專題文章博客和開源

    常用鏈接

    統計

    最新評論

    Java自動內存管理機制

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

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


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 亚洲AV中文无码乱人伦下载| 亚洲国产香蕉人人爽成AV片久久 | 国产在线观看免费不卡| 亚洲一区二区三区免费| 亚洲成a人无码亚洲成www牛牛| 亚洲美女大bbbbbbbbb| 亚洲伦理一区二区| 亚洲大尺码专区影院| avtt天堂网手机版亚洲| 亚洲综合久久综合激情久久| 日本免费高清一本视频| 成年女人看片免费视频播放器| 国产午夜精品免费一区二区三区| 羞羞视频在线观看免费| h视频在线观看免费完整版| 91精品全国免费观看青青| 秋霞人成在线观看免费视频| 四虎国产精品永久免费网址| 国产一区二区三区免费| 国产真人无码作爱免费视频| 亚洲av无码一区二区三区天堂| 亚洲欧洲日韩不卡| 免费乱码中文字幕网站| 免费人成视频x8x8入口| 99无码人妻一区二区三区免费 | 久久嫩草影院免费看夜色| 久久久久久久国产免费看 | 99精品免费观看| 中文字幕在线免费| 久久爰www免费人成| 色偷偷亚洲男人天堂| 免费的黄色网页在线免费观看| 亚洲高清一区二区三区电影| 亚洲精品国产首次亮相| 亚洲heyzo专区无码综合| 亚洲国产成人久久综合一区| 亚洲91av视频| 亚洲av无码专区在线观看亚| 羞羞视频在线观看免费| 人成免费在线视频| 国产免费A∨在线播放|