日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

本地方法栈线程公有_Java运行时区域,哪些区域是线程私有的?哪些是共有的?...

發(fā)布時(shí)間:2023/12/1 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 本地方法栈线程公有_Java运行时区域,哪些区域是线程私有的?哪些是共有的?... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)域大致可以分為:程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧、堆區(qū)、元空間、運(yùn)行時(shí)常量池、直接內(nèi)存等區(qū)域;就是下面這個(gè)樣子的:

其中有些區(qū)域,隨著 JDK 版本的升級(jí)不斷調(diào)整,例如:

JDK 1.6,字符串常量池位于永久代的運(yùn)行時(shí)常量池中;JDK 1.7,字符串常量池從永久代剝離,放入了堆中;JDK 1.8,元空間取代了永久代,并且放入了本地內(nèi)存(Native memory)中。以上幾個(gè)區(qū)域,按照線程公有還是私有可分為:

線程隔離:程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧;線程公有:其它的都是線程共享的區(qū)域。線程私有

1. 程序計(jì)數(shù)器

一個(gè) CPU 在某個(gè)時(shí)間點(diǎn),只能做一件事情,在多線程的情況下,CPU 運(yùn)行時(shí)間被劃分成若干個(gè)時(shí)間片,分配給各個(gè)線程執(zhí)行;

程序計(jì)數(shù)器的作用就是記錄當(dāng)前線程執(zhí)行的位置,當(dāng)線程被切換回來的時(shí)候,能夠找到該線程上次運(yùn)行到哪兒了;所以程序計(jì)數(shù)器一定是線程隔離的。

2. 虛擬機(jī)棧和本地方法棧

虛擬機(jī)棧:每個(gè) Java 方法在執(zhí)行的同時(shí),會(huì)創(chuàng)建一個(gè)棧幀,用于存儲(chǔ)局部變量表、操作數(shù)棧、常量池引用等信息;方法的調(diào)用過程,就是一個(gè)棧幀在 Java 虛擬機(jī)棧中入棧和出棧的過程;本地方法棧:和虛擬機(jī)棧很類似,區(qū)別在于虛擬機(jī)棧為 Java 方法服務(wù),本地方法棧為 Native 方法服務(wù);其中 Native 方法可以看做用其它語言(C、C++ 或匯編語言等)編寫的方法;HotSpot 虛擬機(jī)就選擇了將虛擬機(jī)棧和本地方法棧合并在了一起;為了保證線程中的局部變量不被別的線程訪問到,所以虛擬機(jī)棧和本地方法棧是線程隔離的。

線程公有

1. 堆區(qū)

對(duì)于堆棧的區(qū)別總結(jié)一句話:堆中存對(duì)象,棧中存基本數(shù)據(jù)類型和堆中對(duì)象的引用;一個(gè)對(duì)象的大小是可以動(dòng)態(tài)變化的,而引用是固定大小的。

這么看就容易理解堆為什么是線程公有的了,省地兒啊。

2. 元空間區(qū)/方法區(qū)

方法區(qū)用于存放已被加載的類信息、常量、靜態(tài)變量、即編譯器編譯后的代碼等。

還有要注意的一點(diǎn):方法區(qū)是 JVM 的規(guī)范,在 JDK 1.8 之前,方法區(qū)的實(shí)現(xiàn)是永久代;從 JDK 1.8 開始 JVM 移除了永久代,使用本地內(nèi)存來存儲(chǔ)元數(shù)據(jù)并稱之為:元空間(Metaspace)。

3. 運(yùn)行時(shí)常量池

Class 文件中的常量池,會(huì)在類加載后被放入這個(gè)區(qū)域。

另外在 JDK 1.7 之前,字符串常量池就在運(yùn)行時(shí)常量池中,后來字符串常量池放入了堆中,而運(yùn)行時(shí)常量池仍然在方法區(qū)(元空間區(qū))中。

有興趣的朋友可以自己測試一下,以死循環(huán)方式創(chuàng)建字符串常量,JDK 1.6 會(huì)報(bào)永久代 OOM ;JDK 1.7 會(huì)報(bào)堆區(qū) OOM 。

4. 直接內(nèi)存

也叫做堆外內(nèi)存,并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是Java 虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。

JDK 1.4 加入的 NIO 類,引入了一種基于通道 ( Channel ) 與緩沖區(qū) ( Buffer ) 的 I/O 方式,它可以使用 native 函數(shù)庫直接分配堆外內(nèi)存,然后通過堆上的DirectByteBuffer對(duì)象對(duì)這塊內(nèi)存進(jìn)行引用和操作。

簡單來說,直接內(nèi)存就是 JVM 內(nèi)存之外有一塊內(nèi)存區(qū)域,我們通過堆上的一個(gè)對(duì)象可以操作它;具體等講到 NIO 部分的時(shí)候,再回來加深理解。

總結(jié)

以上是生活随笔為你收集整理的本地方法栈线程公有_Java运行时区域,哪些区域是线程私有的?哪些是共有的?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。