乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      JVM運行時的數(shù)據(jù)區(qū)

       月影曉風(fēng) 2015-09-28

      理解JVM運行時的數(shù)據(jù)區(qū)是Java編程中的進(jìn)階部分。我們在開發(fā)中都遇到過一個很頭疼的問題就是OutOfMemoryError(內(nèi)存溢出錯誤),但是如果我們了解JVM的內(nèi)部實現(xiàn)和其運行時的數(shù)據(jù)區(qū)的工作機(jī)制,那么前面的問題就會迎刃而解。在這片文章中,我們將簡單了解JVM中有哪些運行時數(shù)據(jù)區(qū)以及這些數(shù)據(jù)區(qū)的工作機(jī)制。

      JVM運行時數(shù)據(jù)區(qū)分類

      • 程序計數(shù)器 (Program Counter (PC) Register)
      • JVM棧 (Java Virtual Machine Stacks)
      • 堆內(nèi)存 (Heap Memory)
      • 方法區(qū) (Method Area)
      • 運行時常量池 (Run-time Constant Pool)
      • 本地方法棧 (Native Method Stacks)

      有圖才能說

      按線程持有劃分

      查看上面的圖,可以得知以上六個數(shù)據(jù)區(qū)其實線程私有還是共享,可以分為如下兩種。

      • 單個線程私有(Managed Per-Thread) 屬于這一種的數(shù)據(jù)區(qū)包含 程序計數(shù)器, JVM棧還有本地方法棧。 每個線程都私有這三個數(shù)據(jù)區(qū),這些數(shù)據(jù)區(qū)在其所屬的線程創(chuàng)建時初始化,并隨著所屬線程結(jié)束被銷毀。
      • 多個線程共享 屬于這一種的數(shù)據(jù)區(qū)包含 堆內(nèi)存,方法區(qū)和運行時常量池。這些數(shù)據(jù)區(qū)可以被每一個線程訪問,他們隨著JVM啟動而初始化,同時伴隨JVM關(guān)閉而銷毀。

      程序計數(shù)器

      在通用的計算機(jī)體系中,程序計數(shù)器用來記錄當(dāng)前正在執(zhí)行的指令,在JVM中也是如此。程序計數(shù)器是線程私有,所以當(dāng)一個新的線程創(chuàng)建時,程序計數(shù)器也會創(chuàng)建。由于Java是支持多線程,Java中的程序計數(shù)器用來記錄當(dāng)前線程中正在執(zhí)行的指令。如果當(dāng)前正在執(zhí)行的方法是本地方法,那么此刻程序計數(shù)器的值為undefined。注意這個區(qū)域是唯一一個不拋出OutOfMemoryError的運行時數(shù)據(jù)區(qū)。

      JVM棧

      在介紹JVM棧之前,簡單介紹一個概念,棧幀

      棧幀

      一個棧幀隨著一個方法的調(diào)用開始而創(chuàng)建,這個方法調(diào)用完成而銷毀。棧幀內(nèi)存放者方法中的局部變量,操作數(shù)棧等數(shù)據(jù)。

      JVM棧只對棧幀進(jìn)行存儲,壓棧和出棧操作。棧內(nèi)存的大小可以有兩種設(shè)置,固定值和根據(jù)線程需要動態(tài)增長。在JVM棧這個數(shù)據(jù)區(qū)可能會發(fā)生拋出兩種錯誤。

      • StackOverflowError 出現(xiàn)在棧內(nèi)存設(shè)置成固定值的時候,當(dāng)程序執(zhí)行需要的棧內(nèi)存超過設(shè)定的固定值會拋出這個錯誤。
      • OutOfMemoryError 出現(xiàn)在棧內(nèi)存設(shè)置成動態(tài)增長的時候,當(dāng)JVM嘗試申請的內(nèi)存大小超過了其可用內(nèi)存時會拋出這個錯誤。

      堆數(shù)據(jù)區(qū)

      堆數(shù)據(jù)區(qū)是用來存放對象和數(shù)組(特殊的對象)。堆內(nèi)存由多個線程共享。堆內(nèi)存隨著JVM啟動而創(chuàng)建。眾所周知,Java中有一個很好的特性就是自動垃圾回收。垃圾回收就操作這個數(shù)據(jù)區(qū)來回收對象進(jìn)而釋放內(nèi)存。如果堆內(nèi)存剩余的內(nèi)存不足以滿足于對象創(chuàng)建,JVM會拋出OutOfMemoryError錯誤。

      方法區(qū)

      在JVM規(guī)范中,方法區(qū)被視為堆內(nèi)存的一個邏輯部分。這一點可能由于具體的JVM實現(xiàn)而不同,甚至在方法區(qū)不實現(xiàn)垃圾回收處理也是可以的。方法區(qū)和堆內(nèi)存一樣被多個線程訪問,方法區(qū)中存放類的信息,比如類加載器引用,屬性,方法代碼和構(gòu)造方法和常量等。當(dāng)方法區(qū)的可用內(nèi)存無法滿足內(nèi)存分配需求時,JVM會拋出OutOfMemoryError錯誤。

      運行時常量池

      運行時常量池創(chuàng)建在方法區(qū),當(dāng)一個類或者一個接口被創(chuàng)建的時候,JVM會創(chuàng)建一個運行時常量池。一個運行時常量池實際上是一個類或者接口的class文件中常量池表(constant_pool table)的運行時展示形式。一個運行時常量池包含了多種類型的常量,從諸如運行時可以確定的數(shù)值型字面量到運行時才能決定的方法和屬性引用。當(dāng)運行時常量池?zé)o法滿足于內(nèi)存分配需求時,JVM會拋出OutOfMemoryError錯誤。

      本地方法棧

      一個支持native方法調(diào)用的JVM實現(xiàn),需要有這樣一個數(shù)據(jù)區(qū),就是本地方法棧,Java官方對于本地方法的定義為methods written in a language other than the Java programming language,就是使用非Java語言實現(xiàn)的方法,但是通常我們指的一般為C或者C++,因此這個棧也有著C棧這一稱號。一個不支持本地方法執(zhí)行的JVM沒有必要實現(xiàn)這個數(shù)據(jù)區(qū)域。本地方法棧基本和JVM棧一樣,其大小也是可以設(shè)置為固定值或者動態(tài)增加,因此也會對應(yīng)拋出StackOverflowError和OutOfMemoryError錯誤。

      譯文信息

      注:本文介紹JVM運行時數(shù)據(jù)相對比較概括,以后會有更加詳細(xì)的針對單個數(shù)據(jù)區(qū)的介紹。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多