激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - JVM內(nèi)存管理之JAVA語(yǔ)言的內(nèi)存管理詳解

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

2020-12-17 14:56JavaBlackHole Java教程

下面小編就為大家?guī)?lái)一篇JVM內(nèi)存管理之JAVA語(yǔ)言的內(nèi)存管理詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

引言

內(nèi)存管理一直是JAVA語(yǔ)言自豪與驕傲的資本,它讓JAVA程序員基本上可以徹底忽略與內(nèi)存管理相關(guān)的細(xì)節(jié),只專注于業(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程序員還是跳了專業(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ì)此有興趣的話,可以寫(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寄存器(線程獨(dú)有)全稱是程序計(jì)數(shù)寄存器,它記載著每一個(gè)線程當(dāng)前運(yùn)行的JAVA方法的地址,如果是當(dāng)前執(zhí)行的是本地方法,則程序計(jì)數(shù)器會(huì)是一個(gè)空地址。它的作用就是用來(lái)支持多線程,線程的阻塞、恢復(fù)、掛起等一系列操作,直觀的想象一下,要是沒(méi)有記住每個(gè)線程當(dāng)前運(yùn)行的位置,又如何恢復(fù)呢。依據(jù)這一點(diǎn),每一個(gè)線程都有一個(gè)PC寄存器,也就是說(shuō)PC寄存器是線程獨(dú)有的。

2、JAVA虛擬機(jī)棧(線程獨(dú)有)JAVA虛擬機(jī)棧是在創(chuàng)建線程的同時(shí)創(chuàng)建的,用于存儲(chǔ)棧幀,JAVA虛擬機(jī)棧也是線程獨(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é)束而銷毀,如果方法拋出異常,也算方法結(jié)束。然而在每一個(gè)棧幀中,都有著自己的局部變量表以及操作數(shù)棧以及對(duì)當(dāng)前類的運(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這句話來(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)方式,已滿足多方面的性能需求。

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

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

內(nèi)存管理

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

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

相對(duì)于線程獨(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)稱堆),內(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)稱GC)來(lái)管理的

通常情況下,堆內(nè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è)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/JavaBlackHole/archive/2017/08/17/7383821.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 羞羞网站 | 亚洲福利在线视频 | 在线中文资源免费 | 国产精品爱久久久久久久 | 精品国产96亚洲一区二区三区 | 国产精品爱久久久久久久 | 国产日韩在线观看视频 | 人人玩人人爽 | 久久噜噜噜精品国产亚洲综合 | 爱福利视频网 | 亚洲第一男人天堂 | 欧美亚洲国产一区 | 亚洲射情| 一区二区三区日韩在线 | 国产一区二区视频在线播放 | 免费看毛片网站 | 91免费大片 | 久久人人爽人人爽人人片av高清 | 亚洲成人第一区 | 久久久av亚洲男天堂 | 国产精品久久久久久模特 | 久久精品国产亚洲7777 | 中文字幕免费一区 | 日日久视频 | 国产精品视频导航 | 欧美成人一级 | 精品国产呦系列在线看 | 欧美日韩视频网站 | 久久精品久久精品久久精品 | 国产精品久久久网站 | 午夜久久电影 | 成人午夜小视频 | 久久不射电影网 | 超久久| 7777久久香蕉成人影院 | 美女羞羞视频在线观看 | 羞羞视频一区二区 | 欧美成人国产va精品日本一级 | 新久草在线视频 | 久久丝袜脚交足黄网站免费 | 国产成人高潮免费观看精品 |