摘要:小結(jié)程序計(jì)數(shù)器和虛擬機(jī)棧是線程私有的,而堆和方法區(qū)是線程共享的除了虛擬機(jī)運(yùn)行時內(nèi)存,在中使用類可以直接操作本機(jī)內(nèi)存。
Java的內(nèi)存區(qū)域
運(yùn)行時內(nèi)存 程序計(jì)數(shù)器(Program Counter Register)Java虛擬機(jī)在執(zhí)行Java程序中會把它所管理的內(nèi)存劃分為若干個數(shù)據(jù)區(qū)域,這些區(qū)域有各自的用途,以及生命周期,有些依賴虛擬機(jī)進(jìn)程啟動而存在,有些依賴用戶線程的啟動和結(jié)束而建立和銷毀
程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的指示器,字節(jié)碼解釋器通過改變這個計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。
由于Java虛擬機(jī)的多線程是通過線程調(diào)度(輪詢)切換分配處理器執(zhí)行時間的方式來實(shí)現(xiàn)的,在任何一個確定的時刻都只會執(zhí)行一條線程中的指令。所以為了當(dāng)線程切換后能找到之前執(zhí)行指令的位置,每個線程都需要有一個獨(dú)立的程序計(jì)數(shù)器,各個線程之間的程序計(jì)數(shù)器互相不影響,這類內(nèi)存區(qū)域?yàn)椤熬€程私有”的內(nèi)存區(qū)域。
Java虛擬機(jī)棧和程序計(jì)數(shù)器一樣,Java虛擬機(jī)棧(以下簡稱棧)也是“線程私有”的,它的生命周期和線程相同,每個方法在執(zhí)行時都會創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表(方法中定義的變量),操作數(shù)棧,動態(tài)鏈接,方法出口等信息。每個方法從調(diào)用直至執(zhí)行完成的過程,就是對應(yīng)著一個棧幀在棧中入棧和出棧的過程。
本地方法棧本地方法棧和Java虛擬機(jī)棧一樣,本地方法棧用于執(zhí)行Native方法
Java堆(Java Heap)Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動時被創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對象的實(shí)例,幾乎所有的對象實(shí)例都在這里分配內(nèi)存,Java堆是垃圾收集器管理的主要區(qū)域,由于現(xiàn)在很多收集器都采用分代收集算法,所有Java堆還可以細(xì)分為:新生代和老年代??梢酝ㄟ^-Xmx和-Xms來控制堆內(nèi)存的大小
方法區(qū)方法區(qū)和Java堆一樣,也是各個線程共享的內(nèi)存區(qū)域,它用于存儲已經(jīng)被虛擬機(jī)加載的類信息,常量,靜態(tài)變量,即時編譯器編譯后的代碼等數(shù)據(jù)。一般也稱作為“永代區(qū)”(Permanent Generation),這里要特別說明一下,因?yàn)槲覀兪褂玫闹髁魈摂M機(jī)HotSpot的設(shè)計(jì)團(tuán)隊(duì)用“永代區(qū)”來實(shí)現(xiàn)方法區(qū),這樣HotSpot的垃圾收集器就可以像管理堆那樣管理這部分內(nèi)存,在JDK1.7的HotSpot中,已經(jīng)把字符串常量池移出“永代區(qū)”了。
直接內(nèi)存(Direct Memory)直接內(nèi)存并不是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的一部分,但是如果你使用了NIO的類,就會導(dǎo)致OutOfMemoryError異常出現(xiàn)
NIO引入了一種基于通道(Channle)與緩沖區(qū)(Buffer)的I/O方法,它可以使用Native函數(shù)庫直接分配堆外的內(nèi)存,然后通過一個存儲在Java堆中的DirectByteBuffer對象作為這塊內(nèi)存的引用進(jìn)行操作。這樣能避免在Java堆和Native堆中來回復(fù)制數(shù)據(jù)的開銷,本機(jī)直接內(nèi)存的分配不會受到Java堆大小的限制,但是會受到物理內(nèi)存的限制,所有也會拋出OutOfMemoryError異常。
“程序計(jì)數(shù)器”和“Java虛擬機(jī)?!笔蔷€程私有的,而“Java堆”和“方法區(qū)”是線程共享的
除了虛擬機(jī)運(yùn)行時內(nèi)存,在Java中使用NIO類可以直接操作本機(jī)內(nèi)存。
方法區(qū)在HotSpot中用于存放各種“常量信息”
Java堆中存放了程序中所有的對象實(shí)例
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64731.html
摘要:運(yùn)行時數(shù)據(jù)區(qū)域虛擬機(jī)在執(zhí)行程序的過程中會把它管理的內(nèi)存劃分成若干個不同的數(shù)據(jù)區(qū)域。堆虛擬機(jī)所管理的內(nèi)存中最大的一塊,堆是所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動時創(chuàng)建。 《深入理解Java虛擬機(jī):JVM高級特性與最佳實(shí)踐(第二版》讀書筆記 1 概述 對于Java程序員來說,在虛擬機(jī)自動內(nèi)存管理機(jī)制下,不再需要像C/C++程序開發(fā)程序員這樣為內(nèi)一個new 操作去寫對應(yīng)的delete/...
摘要:深入理解虛擬機(jī)高級特性與最佳實(shí)踐第二版讀書筆記與常見面試題總結(jié)本節(jié)常見面試題介紹下內(nèi)存區(qū)域運(yùn)行時數(shù)據(jù)區(qū)。運(yùn)行時數(shù)據(jù)區(qū)域虛擬機(jī)在執(zhí)行程序的過程中會把它管理的內(nèi)存劃分成若干個不同的數(shù)據(jù)區(qū)域。 《深入理解Java虛擬機(jī):JVM高級特性與最佳實(shí)踐(第二版》讀書筆記與常見面試題總結(jié) 本節(jié)常見面試題: 介紹下Java內(nèi)存區(qū)域(運(yùn)行時數(shù)據(jù)區(qū))。 對象的訪問定位的兩種方式。 1 概述 對于Java...
摘要:編譯參見深入理解虛擬機(jī)節(jié)走進(jìn)之一自己編譯源碼內(nèi)存模型運(yùn)行時數(shù)據(jù)區(qū)域根據(jù)虛擬機(jī)規(guī)范的規(guī)定,的內(nèi)存包括以下幾個運(yùn)運(yùn)行時數(shù)據(jù)區(qū)域程序計(jì)數(shù)器程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,他可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。 點(diǎn)擊進(jìn)入我的博客 1.1 基礎(chǔ)知識 1.1.1 一些基本概念 JDK(Java Development Kit):Java語言、Java虛擬機(jī)、Java API類庫JRE(...
摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術(shù)并且有豐富的程序開發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問題在面試中經(jīng)常會被提到。將對象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對象稱之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時注解 Java 程序員快速上手 Kot...
閱讀 2523·2021-10-14 09:42
閱讀 1156·2021-09-22 15:09
閱讀 3561·2021-09-09 09:33
閱讀 3042·2021-09-07 09:59
閱讀 3653·2021-09-03 10:34
閱讀 3574·2021-07-26 22:01
閱讀 2840·2019-08-30 13:06
閱讀 1220·2019-08-30 10:48