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

歡迎訪問 生活随笔!

生活随笔

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

java

JAVA基础驿站,Java基础:内存模型

發(fā)布時(shí)間:2023/12/15 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA基础驿站,Java基础:内存模型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在java基礎(chǔ)當(dāng)中,有很重要一塊的內(nèi)容,就是關(guān)于java當(dāng)中的內(nèi)存模型,所涉及的問題無非就是關(guān)于java當(dāng)中的類、實(shí)例、變量、常量、靜態(tài)變量、方法等blabla的東西都分別存儲(chǔ)在什么地方。這部分的內(nèi)容雖然繁瑣,但是也是面試當(dāng)中經(jīng)常涉及詢問的部分,今天就在這里總結(jié)一下java當(dāng)中的內(nèi)存模型。

首先我們來看一下java的內(nèi)存模型大體分為了幾個(gè)部分:

從圖片當(dāng)中可以看到,java運(yùn)行是的內(nèi)存模型,大體分為了五個(gè)部分:1.方法區(qū)(靜態(tài)區(qū))、2.虛擬機(jī)棧、3.本地方法棧、4.堆、5.程序計(jì)數(shù)器,在每一個(gè)不同的部分,分別存儲(chǔ)著java運(yùn)行當(dāng)中不一樣的信息,接下來將分類舉例;

1.方法區(qū)(又稱為靜態(tài)區(qū),也是GC機(jī)制當(dāng)中的永久帶)

1)是被線程共享的一個(gè)區(qū)域。

2)存儲(chǔ)虛擬機(jī)加載的類的相關(guān)信息,如class、以及static變量、方法信息(包括方法名、參數(shù)、返回類型)、域信息等。

3)方法區(qū)還包含了常量池,常量池中存儲(chǔ)了如字符串、final變量值、類名和方法名常量。

2.虛擬機(jī)棧(又稱java棧)

1)是一個(gè)線程隔離的區(qū)域,即私有的,其他線程無法訪問的、

2)每個(gè)線程創(chuàng)建的時(shí)候,jvm就會(huì)創(chuàng)建一個(gè)棧區(qū),棧中只保存基礎(chǔ)數(shù)據(jù)類型的對(duì)象和自定義對(duì)象的引用(不是對(duì)象),對(duì)象都存放在堆區(qū)中 。

3)每個(gè)方法執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表,一個(gè)棧區(qū)包含多個(gè)棧幀,當(dāng)方法執(zhí)行的時(shí)候生成的棧幀會(huì)對(duì)應(yīng)入棧,當(dāng)方法返回的時(shí)候,棧幀將被彈出

4)棧分為3個(gè)部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。

優(yōu)點(diǎn):存取速度比堆要快,僅次于直接位于CPU的寄存器。

缺點(diǎn):必須確定的是存在stack中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。

3.堆

1)是被線程共享的一個(gè)區(qū)域

2)存儲(chǔ)的全部是對(duì)象,每個(gè)對(duì)象都包含一個(gè)與之對(duì)應(yīng)的class的信息。(class的目的是得到操作指令)

優(yōu)點(diǎn):堆的優(yōu)勢(shì)是可以動(dòng)態(tài)的分配內(nèi)存大小,生存期也不必事先告訴編譯器,java的垃圾收集器會(huì)自動(dòng)收取這些不在使用的數(shù)據(jù),

缺點(diǎn):由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度慢。

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

由于Java是支持多線程執(zhí)行的,所以程序執(zhí)行的軌跡不可能一直都是線性執(zhí)行。當(dāng)有多個(gè)線程交叉執(zhí)行時(shí),被中斷的線程的程序當(dāng)前執(zhí)行到哪條內(nèi)存地址必然要保存下來,以便用于被中斷的線程恢復(fù)執(zhí)行時(shí)再按照被中斷時(shí)的指令地址繼續(xù)執(zhí)行下去。為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每個(gè)線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,各個(gè)線程之間計(jì)數(shù)器互不影響,獨(dú)立存儲(chǔ),我們稱這類內(nèi)存區(qū)域?yàn)椤熬€程私有”的內(nèi)存,這在某種程度上有點(diǎn)類似于“ThreadLocal”,是線程安全的。

5.本地方法棧

本地方法棧和Java棧所發(fā)揮的作用非常相似,區(qū)別不過是Java棧為JVM執(zhí)行Java方法服務(wù),而本地方法棧為JVM執(zhí)行Native方法服務(wù)。本地方法棧也會(huì)拋出StackOverflowError和OutOfMemoryError異常。

(這里也只是拋出了個(gè)概念,并沒有涉及到這部分的使用,所以我也不是很清楚它是干嘛的)

總結(jié)

以上是生活随笔為你收集整理的JAVA基础驿站,Java基础:内存模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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