日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 月影曉風 2015-09-28

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

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)建時初始化,并隨著所屬線程結束被銷毀。
  • 多個線程共享 屬于這一種的數(shù)據(jù)區(qū)包含 堆內(nèi)存,方法區(qū)和運行時常量池。這些數(shù)據(jù)區(qū)可以被每一個線程訪問,他們隨著JVM啟動而初始化,同時伴隨JVM關閉而銷毀。

程序計數(shù)器

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

JVM棧

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

棧幀

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

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

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

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

堆數(shù)據(jù)區(qū)是用來存放對象和數(shù)組(特殊的對象)。堆內(nèi)存由多個線程共享。堆內(nèi)存隨著JVM啟動而創(chuàng)建。眾所周知,Java中有一個很好的特性就是自動垃圾回收。垃圾回收就操作這個數(shù)據(jù)區(qū)來回收對象進而釋放內(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ū)中存放類的信息,比如類加載器引用,屬性,方法代碼和構造方法和常量等。當方法區(qū)的可用內(nèi)存無法滿足內(nèi)存分配需求時,JVM會拋出OutOfMemoryError錯誤。

運行時常量池

運行時常量池創(chuàng)建在方法區(qū),當一個類或者一個接口被創(chuàng)建的時候,JVM會創(chuàng)建一個運行時常量池。一個運行時常量池實際上是一個類或者接口的class文件中常量池表(constant_pool table)的運行時展示形式。一個運行時常量池包含了多種類型的常量,從諸如運行時可以確定的數(shù)值型字面量到運行時才能決定的方法和屬性引用。當運行時常量池無法滿足于內(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棧一樣,其大小也是可以設置為固定值或者動態(tài)增加,因此也會對應拋出StackOverflowError和OutOfMemoryError錯誤。

譯文信息

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多