AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

深入理解Java內(nèi)存工作原理

來(lái)源: 責(zé)編: 時(shí)間:2023-09-20 21:55:19 266觀看
導(dǎo)讀在Java中,JVM(Java虛擬機(jī))負(fù)責(zé)自動(dòng)管理內(nèi)存,用于存儲(chǔ)變量、類、字段等等。JVM將內(nèi)存劃分為兩個(gè)區(qū)域,分別是棧(Stack)和堆(Heap)。什么是棧在JVM中,棧是一種高效的內(nèi)存管理方式,每個(gè)線程都有自己的棧區(qū)域。棧采用堆疊的方式,將實(shí)例

在Java中,JVM(Java虛擬機(jī))負(fù)責(zé)自動(dòng)管理內(nèi)存,用于存儲(chǔ)變量、類、字段等等。JVM將內(nèi)存劃分為兩個(gè)區(qū)域,分別是棧(Stack)和堆(Heap)。VMs28資訊網(wǎng)——每日最新資訊28at.com

VMs28資訊網(wǎng)——每日最新資訊28at.com

什么是棧

在JVM中,棧是一種高效的內(nèi)存管理方式,每個(gè)線程都有自己的棧區(qū)域。棧采用堆疊的方式,將實(shí)例化的字段依次添加到內(nèi)存中。不過(guò),棧的大小是有限的,所以無(wú)法存儲(chǔ)整個(gè)對(duì)象。因此,原始類型和對(duì)象指針可以直接存儲(chǔ)在棧中,而不是整個(gè)對(duì)象。棧的名字就像它的功能一樣,只是一個(gè)堆疊的空間,無(wú)法容納大型對(duì)象。VMs28資訊網(wǎng)——每日最新資訊28at.com

VMs28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)需要移除對(duì)象時(shí),我們需要按照堆疊的順序逐個(gè)移除,即先移除最先添加的對(duì)象。這是因?yàn)閿?shù)據(jù)在堆疊時(shí),后添加的對(duì)象會(huì)放在先添加的對(duì)象的上方,如果不移除這些對(duì)象,就無(wú)法到達(dá)底部。簡(jiǎn)而言之,要想取出底部的對(duì)象,必須先移除位于其上方的對(duì)象。VMs28資訊網(wǎng)——每日最新資訊28at.com

VMs28資訊網(wǎng)——每日最新資訊28at.com

什么是堆

從GIF動(dòng)畫中可以看到,堆的大小比棧要大,因?yàn)槎咽谴鎯?chǔ)對(duì)象的主要區(qū)域。每個(gè)創(chuàng)建的對(duì)象都存儲(chǔ)在堆中,而對(duì)象的引用則存儲(chǔ)在棧中。這種設(shè)計(jì)方式使得棧和堆之間建立了關(guān)聯(lián),通過(guò)棧中的引用可以訪問(wèn)和操作堆中的對(duì)象。如下所示:VMs28資訊網(wǎng)——每日最新資訊28at.com

 public List<String> test() {    String newString = "test";    List<String> testList = new ArrayList<>();    testList.add(newString);    return testList;  }

VMs28資訊網(wǎng)——每日最新資訊28at.com

與之相反,應(yīng)用程序只有一個(gè)堆。這個(gè)設(shè)計(jì)是合理的,因?yàn)槲覀兛赡苄枰诜椒ㄖg傳遞多個(gè)大型對(duì)象。棧主要用于存儲(chǔ)局部變量,可能會(huì)有多個(gè)棧存在,但它們都共享同一個(gè)堆來(lái)存儲(chǔ)對(duì)象。具體來(lái)說(shuō),對(duì)象的指針存儲(chǔ)在棧中。因此,當(dāng)我們需要在方法之間傳遞對(duì)象時(shí),不會(huì)在棧中復(fù)制整個(gè)對(duì)象,而是傳遞對(duì)象的引用。這種方式既高效又節(jié)省內(nèi)存空間。VMs28資訊網(wǎng)——每日最新資訊28at.com

此外,堆實(shí)際上并不是一個(gè)固定的單一區(qū)域。如果你放大查看堆,你會(huì)看到4個(gè)不同的區(qū)域。VMs28資訊網(wǎng)——每日最新資訊28at.com

VMs28資訊網(wǎng)——每日最新資訊28at.com

它們被稱為代(Generation)。堆建立在兩個(gè)主要代上,一個(gè)是年輕代(Young Generation),另一個(gè)是老年代(Old Generation)。年輕代又被分為三個(gè)空間,分別是Eden、Survivor 0和Survivor 1。當(dāng)你學(xué)到它們的作用時(shí),會(huì)更清楚。創(chuàng)建的對(duì)象首先放置在Eden空間中,然后當(dāng)Eden空間滿時(shí),對(duì)象會(huì)被移動(dòng)到Survivor 0或Survivor 1。之后,創(chuàng)建的對(duì)象再次放置在Eden中。當(dāng)Eden再次滿時(shí),Eden和Survivor 0或1將被移動(dòng)到Survivor 0或1。如果對(duì)象被移動(dòng)超過(guò)五次,那么這些對(duì)象將被放置在老年代中。這意味著,現(xiàn)在這些對(duì)象是需要的,并且將存活在老年代中,除非失去了其引用。如果棧中沒(méi)有持有其引用的變量,這意味著該對(duì)象符合垃圾回收的條件。最后一個(gè)對(duì)性能問(wèn)題非常重要,因此我們需要了解Java內(nèi)存如何工作才能理解它。VMs28資訊網(wǎng)——每日最新資訊28at.com

Metaspace

除了之前提到的棧和堆區(qū)域外,內(nèi)存中還有另一個(gè)區(qū)域,即Metaspace。Metaspace是存儲(chǔ)應(yīng)用程序元數(shù)據(jù)的區(qū)域,它承擔(dān)著重要的任務(wù)。通常情況下,我們不需要深入了解Metaspace內(nèi)部情況。Metaspace還有一個(gè)重要的功能,就是存儲(chǔ)靜態(tài)變量、方法和類。這也解釋了為什么靜態(tài)關(guān)鍵字可以從任何地方訪問(wèn),因?yàn)樗鼈兊拇鎯?chǔ)位置就在Metaspace中,這樣每個(gè)線程都可以方便地進(jìn)行訪問(wèn)。Metaspace的存在為我們提供了便利,使得靜態(tài)元素的訪問(wèn)變得更加方便。VMs28資訊網(wǎng)——每日最新資訊28at.com

JVM啟動(dòng)參數(shù)中的常用標(biāo)志

可以通過(guò)設(shè)置一些標(biāo)志來(lái)告訴JVM要執(zhí)行的操作。以下是一些標(biāo)志的示例:VMs28資訊網(wǎng)——每日最新資訊28at.com

  • XmsNg 設(shè)置初始大小
  • XmxNg 設(shè)置最大大小
  • XX:NewRatio=N 年輕代與老年代的比例
  • XX:NewSize=N 年輕代的初始大小
  • XX:MaxNewSize=N 年輕代的最大大小

本文鏈接:http://www.tebozhan.com/showinfo-26-10585-0.html深入理解Java內(nèi)存工作原理

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Spring Boot是如何處理HTTP請(qǐng)求的?

下一篇: 玩轉(zhuǎn)Python插入排序:從基礎(chǔ)到進(jìn)階,成為排序?qū)<?/a>

標(biāo)簽:
  • 熱門焦點(diǎn)
Top