JVM內(nèi)存管理之JAVA語(yǔ)言的內(nèi)存管理詳解-創(chuàng)新互聯(lián)

引言

創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)從事網(wǎng)站制作、做網(wǎng)站的網(wǎng)絡(luò)公司。作為專(zhuān)業(yè)網(wǎng)站設(shè)計(jì)公司,創(chuàng)新互聯(lián)依托的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專(zhuān)業(yè)的成都網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷(xiāo)推廣及網(wǎng)站設(shè)計(jì)開(kāi)發(fā)服務(wù)!

內(nèi)存管理一直是JAVA語(yǔ)言自豪與驕傲的資本,它讓JAVA程序員基本上可以徹底忽略與內(nèi)存管理相關(guān)的細(xì)節(jié),只專(zhuān)注于業(yè)務(wù)邏輯。不過(guò)世界上不存在十全十美的好事,在帶來(lái)了便利的同時(shí),也因此引入了很多令人抓狂的內(nèi)存溢出和泄露的問(wèn)題。

可怕的事情還不只如此,有些使用其它語(yǔ)言開(kāi)發(fā)的程序員,給JAVA程序員扣上了一個(gè)“不懂內(nèi)存”的帽子,這著實(shí)有點(diǎn)讓人難以接受。畢竟JAVA當(dāng)中沒(méi)有malloc和delete、沒(méi)有析構(gòu)函數(shù)、沒(méi)有指針,剛開(kāi)始接觸JAVA的程序員們又怎么可能接觸內(nèi)存這一部分呢,更何況有不少JAVA程序員還是跳了專(zhuān)業(yè)半路出家的朋友。

不過(guò)事實(shí)盡管難以接受,但也確實(shí)有不少JAVA程序員對(duì)內(nèi)存這部分可謂一竅不知,盡管掌握內(nèi)存的相關(guān)知識(shí),或許并不能給平時(shí)的開(kāi)發(fā)帶來(lái)翻天覆地的變化和好處,不過(guò)它仍然會(huì)潛移默化的提高你的技術(shù)水準(zhǔn),這一點(diǎn)在了解完內(nèi)存管理之后,相信各位就會(huì)深有體會(huì)了。

內(nèi)存劃分

談到內(nèi)存這一詞匯,它是在程序運(yùn)行時(shí)才有的數(shù)據(jù)存儲(chǔ)區(qū)域,而對(duì)于這一塊區(qū)域的劃分,各個(gè)虛擬機(jī)有各自的劃分方式,不過(guò)它們都必須遵從JAVA虛擬機(jī)的基本規(guī)范去實(shí)現(xiàn)。

虛擬機(jī)規(guī)范中,將內(nèi)存劃分為六大部分,分別是PC寄存器、JAVA虛擬機(jī)棧、JAVA堆、方法區(qū)、運(yùn)行時(shí)常量池以及本地方法棧。

JAVA虛擬機(jī)規(guī)范與JAVA虛擬機(jī)

這里還需要解釋一下JAVA虛擬機(jī)規(guī)范和JAVA虛擬機(jī)的區(qū)別,顧名思義,JAVA虛擬機(jī)規(guī)范是一種對(duì)JAVA虛擬機(jī)實(shí)現(xiàn)的規(guī)范要求,是由oracle制定的,而我們平時(shí)常說(shuō)的JAVA虛擬機(jī)一般是指的一種具體的JAVA虛擬機(jī)規(guī)范的實(shí)現(xiàn)。比如我們最經(jīng)常使用的JAVA虛擬機(jī)hotspot,其實(shí)JAVA虛擬機(jī)還有很多種實(shí)現(xiàn),甚至如果你對(duì)JAVA虛擬機(jī)規(guī)范有了深入的了解而且對(duì)此有興趣的話(huà),可以寫(xiě)一個(gè)自己的JAVA虛擬機(jī),當(dāng)然這其中的難度不難想象。

結(jié)構(gòu)圖

下圖是引用于百度文庫(kù)的一張JVM的結(jié)構(gòu)圖,由于運(yùn)行時(shí)常量池是由方法區(qū)分配出來(lái)的區(qū)域,所以此圖當(dāng)中沒(méi)有運(yùn)行時(shí)常量池。

JVM內(nèi)存管理之JAVA語(yǔ)言的內(nèi)存管理詳解

內(nèi)存區(qū)域詳解

針對(duì)上面這張圖,內(nèi)存就是指的矩形框當(dāng)中運(yùn)行期數(shù)據(jù)區(qū)這部分,下面簡(jiǎn)單介紹一下各個(gè)部分的作用:

1、PC寄存器(線(xiàn)程獨(dú)有):全稱(chēng)是程序計(jì)數(shù)寄存器,它記載著每一個(gè)線(xiàn)程當(dāng)前運(yùn)行的JAVA方法的地址,如果是當(dāng)前執(zhí)行的是本地方法,則程序計(jì)數(shù)器會(huì)是一個(gè)空地址。它的作用就是用來(lái)支持多線(xiàn)程,線(xiàn)程的阻塞、恢復(fù)、掛起等一系列操作,直觀(guān)的想象一下,要是沒(méi)有記住每個(gè)線(xiàn)程當(dāng)前運(yùn)行的位置,又如何恢復(fù)呢。依據(jù)這一點(diǎn),每一個(gè)線(xiàn)程都有一個(gè)PC寄存器,也就是說(shuō)PC寄存器是線(xiàn)程獨(dú)有的。

2、JAVA虛擬機(jī)棧(線(xiàn)程獨(dú)有)JAVA虛擬機(jī)棧是在創(chuàng)建線(xiàn)程的同時(shí)創(chuàng)建的,用于存儲(chǔ)棧幀,JAVA虛擬機(jī)棧也是線(xiàn)程獨(dú)有的。

棧幀:簡(jiǎn)單點(diǎn)說(shuō),可以解釋為是一個(gè)方法運(yùn)行時(shí),臨時(shí)數(shù)據(jù)的存儲(chǔ)區(qū)域,具體點(diǎn)說(shuō),它里面包括了數(shù)據(jù)和部分的過(guò)程結(jié)果,與此同時(shí),它又肩負(fù)著處理方法返回值、動(dòng)態(tài)鏈接以及異常分派的任務(wù)。棧幀是隨著方法的創(chuàng)建而創(chuàng)建,隨著方法的結(jié)束而銷(xiāo)毀,如果方法拋出異常,也算方法結(jié)束。然而在每一個(gè)棧幀中,都有著自己的局部變量表以及操作數(shù)棧以及對(duì)當(dāng)前類(lèi)的運(yùn)行時(shí)常量池的引用。

局部變量表:它是一個(gè)方法局部變量的列表,是在編譯時(shí)期就寫(xiě)入了class文件當(dāng)中。簡(jiǎn)單的理解,可以將它理解為一個(gè)對(duì)象數(shù)組,而里面按照索引0到length-1分別對(duì)應(yīng)于每一個(gè)局部變量,特別的,如果是實(shí)例方法的局部變量表,第0個(gè)局部變量會(huì)是一個(gè)指向當(dāng)前實(shí)例的引用,也就是this關(guān)鍵字,其余的局部變量則從索引1開(kāi)始。

操作數(shù)棧它是一個(gè)后進(jìn)先出(pFO)棧,而它的長(zhǎng)度也是在編譯時(shí)期就寫(xiě)入了class文件當(dāng)中,是固定的。它的作用就是提供字節(jié)碼指令操作變量計(jì)算的空間,比如簡(jiǎn)單的,對(duì)于int a=9這句話(huà)來(lái)說(shuō),就需要先將9壓入操作數(shù)棧,再將9賦給a這個(gè)變量。

3、JAVA堆(全局共享):這一部分是JAVA內(nèi)存中最重要的一部分,之所以說(shuō)是最重要的一部分,并不是因?yàn)樗闹匾?,而是指作為開(kāi)發(fā)人員最應(yīng)該關(guān)注的一部分。它隨著JAVA虛擬機(jī)的啟動(dòng)創(chuàng)建,儲(chǔ)存著所有對(duì)象實(shí)例以及數(shù)組對(duì)象,而且內(nèi)置了“自動(dòng)內(nèi)存管理系統(tǒng)”,也就是我們常說(shuō)的垃圾搜集器(GC)。JAVA堆中的內(nèi)存釋放是不受開(kāi)發(fā)人員控制的,完全由JAVA虛擬機(jī)一手操辦。對(duì)于JAVA虛擬機(jī)如何實(shí)現(xiàn)垃圾搜集器,JAVA虛擬機(jī)規(guī)范沒(méi)有明確的規(guī)定,也正因如此,我們平時(shí)使用的JAVA虛擬機(jī)中提供了許多種垃圾搜集器,它們采用不同的算法以及實(shí)現(xiàn)方式,已滿(mǎn)足多方面的性能需求。

4、方法區(qū)(全局共享):方法區(qū)也是堆的一個(gè)組成部分,它主要存儲(chǔ)的是運(yùn)行時(shí)常量池、字段信息、方法信息、構(gòu)造方法與普通函數(shù)的字節(jié)碼內(nèi)容以及一些特殊方法。它與JAVA堆的區(qū)別除了存儲(chǔ)的信息與JAVA堆不一樣之外,大的區(qū)別就是這一部分JAVA虛擬機(jī)規(guī)范不強(qiáng)制要求實(shí)現(xiàn)自動(dòng)內(nèi)存管理系統(tǒng)(GC)。

5、本地方法棧(線(xiàn)程獨(dú)有)本地方法棧是一個(gè)傳統(tǒng)的棧,它用來(lái)支持native方法的執(zhí)行。如果JAVA虛擬機(jī)是使用的其它語(yǔ)言實(shí)現(xiàn)指令集解釋器的時(shí)候,也會(huì)用到本地方法棧。如果前面這兩種都未發(fā)生,也就是說(shuō)如果JAVA虛擬機(jī)不依賴(lài)于本地方法棧,而且JAVA虛擬機(jī)也不支持native方法,則不需要本地方法棧。而如果需要的話(huà),則本地方法棧也是隨每一個(gè)線(xiàn)程的啟動(dòng)而創(chuàng)建的。

上面五個(gè)內(nèi)存區(qū)域,除了PC寄存器之外,其余四個(gè)一般情況下,都要求JAVA虛擬機(jī)實(shí)現(xiàn)提供給客戶(hù)調(diào)節(jié)大小的參數(shù),也就是我們常用的Xms、Xmx等等。

內(nèi)存管理

內(nèi)存管理分為內(nèi)存分配和內(nèi)存釋放,看一下上面的五個(gè)內(nèi)存區(qū)域,其實(shí)可以大致分為兩部分,一部分是全局共享,一部分是線(xiàn)程獨(dú)有

對(duì)于線(xiàn)程獨(dú)有的這部分內(nèi)存,都是隨著線(xiàn)程的啟動(dòng)而創(chuàng)建,而當(dāng)線(xiàn)程被銷(xiāo)毀時(shí),內(nèi)存也就隨之釋放。這一部分內(nèi)存,不需要垃圾搜集器的管理,而是JAVA虛擬機(jī)來(lái)主動(dòng)管理,每當(dāng)一個(gè)線(xiàn)程被創(chuàng)建的時(shí)候,JAVA虛擬機(jī)就會(huì)為其分配相應(yīng)的PC寄存器和JAVA虛擬機(jī)棧,如果需要的話(huà),還會(huì)有本地方法棧。相應(yīng)的,當(dāng)一個(gè)線(xiàn)程被銷(xiāo)毀的時(shí)候,JAVA虛擬機(jī)也會(huì)將這個(gè)線(xiàn)程所占有的內(nèi)存全部釋放

相對(duì)于線(xiàn)程獨(dú)有的那部分內(nèi)存,全局共享的這部分內(nèi)存更加難以處理,不過(guò)這只是針對(duì)于虛擬機(jī)的實(shí)現(xiàn)來(lái)說(shuō),因?yàn)檫@一部分內(nèi)存是要實(shí)現(xiàn)自動(dòng)內(nèi)存管理系統(tǒng)(GC)的。

全局共享的這部分內(nèi)存(以下簡(jiǎn)稱(chēng)堆),內(nèi)存分配主要是由程序員顯示的使用new關(guān)鍵字來(lái)觸發(fā)的,至于new出來(lái)的這部分內(nèi)存在哪分配,如何分配,則是JAVA虛擬機(jī)來(lái)決定。而這部分內(nèi)存的釋放,則是由自動(dòng)內(nèi)存管理系統(tǒng)(以下簡(jiǎn)稱(chēng)GC)來(lái)管理的。

通常情況下,堆內(nèi)存分配是要依賴(lài)于GC的策略與實(shí)現(xiàn)的,在分配的時(shí)候,就要考慮好到時(shí)候如何回收這部分內(nèi)存。也是正因?yàn)槿绱?,?duì)于內(nèi)存分配這一部分的講解來(lái)說(shuō),我們必須得先了解內(nèi)存是如何被回收的,才能更好的理解內(nèi)存要怎么被分配。

結(jié)束語(yǔ)

本次對(duì)于JAVA語(yǔ)言中內(nèi)存管理的概述就到此結(jié)束了。

以上這篇JVM內(nèi)存管理之JAVA語(yǔ)言的內(nèi)存管理詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持創(chuàng)新互聯(lián)。

分享題目:JVM內(nèi)存管理之JAVA語(yǔ)言的內(nèi)存管理詳解-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://bm7419.com/article40/igeeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)網(wǎng)站收錄、關(guān)鍵詞優(yōu)化、移動(dòng)網(wǎng)站建設(shè)網(wǎng)站導(dǎo)航、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)