最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM內存管理之JAVA語言的內存管理詳解

 更新時間:2017年08月18日 08:35:16   投稿:jingxian  
下面小編就為大家?guī)硪黄狫VM內存管理之JAVA語言的內存管理詳解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

引言

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

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

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

內存劃分

談到內存這一詞匯,它是在程序運行時才有的數據存儲區(qū)域,而對于這一塊區(qū)域的劃分,各個虛擬機有各自的劃分方式,不過它們都必須遵從JAVA虛擬機的基本規(guī)范去實現。

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

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

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

結構圖

下圖是引用于百度文庫的一張JVM的結構圖,由于運行時常量池是由方法區(qū)分配出來的區(qū)域,所以此圖當中沒有運行時常量池。

內存區(qū)域詳解

針對上面這張圖,內存就是指的矩形框當中運行期數據區(qū)這部分,下面簡單介紹一下各個部分的作用:

1、PC寄存器(線程獨有)全稱是程序計數寄存器,它記載著每一個線程當前運行的JAVA方法的地址,如果是當前執(zhí)行的是本地方法,則程序計數器會是一個空地址。它的作用就是用來支持多線程,線程的阻塞、恢復、掛起等一系列操作,直觀的想象一下,要是沒有記住每個線程當前運行的位置,又如何恢復呢。依據這一點,每一個線程都有一個PC寄存器,也就是說PC寄存器是線程獨有的。

2、JAVA虛擬機棧(線程獨有)JAVA虛擬機棧是在創(chuàng)建線程的同時創(chuàng)建的,用于存儲棧幀,JAVA虛擬機棧也是線程獨有的。

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

局部變量表:它是一個方法局部變量的列表,是在編譯時期就寫入了class文件當中。簡單的理解,可以將它理解為一個對象數組,而里面按照索引0到length-1分別對應于每一個局部變量,特別的,如果是實例方法的局部變量表,第0個局部變量會是一個指向當前實例的引用,也就是this關鍵字,其余的局部變量則從索引1開始。

操作數棧它是一個后進先出(pFO)棧,而它的長度也是在編譯時期就寫入了class文件當中,是固定的。它的作用就是提供字節(jié)碼指令操作變量計算的空間,比如簡單的,對于int a=9這句話來說,就需要先將9壓入操作數棧,再將9賦給a這個變量。

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

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

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

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

內存管理

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

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

相對于線程獨有的那部分內存,全局共享的這部分內存更加難以處理,不過這只是針對于虛擬機的實現來說,因為這一部分內存是要實現自動內存管理系統(tǒng)(GC)的。

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

通常情況下,堆內存分配是要依賴于GC的策略與實現的,在分配的時候,就要考慮好到時候如何回收這部分內存。也是正因為如此,對于內存分配這一部分的講解來說,我們必須得先了解內存是如何被回收的,才能更好的理解內存要怎么被分配。

結束語

本次對于JAVA語言中內存管理的概述就到此結束了。

以上這篇JVM內存管理之JAVA語言的內存管理詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java ArrayList集合詳解(Java動態(tài)數組)

    Java ArrayList集合詳解(Java動態(tài)數組)

    這篇文章主要介紹了Java ArrayList集合詳解(Java動態(tài)數組),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java實現鼠標模擬與鍵盤映射

    Java實現鼠標模擬與鍵盤映射

    這篇文章主要為大家詳細介紹了Java實現鼠標模擬與鍵盤映射,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java object wait notify notifyAll代碼解析

    Java object wait notify notifyAll代碼解析

    這篇文章主要介紹了Java object wait notify notifyAll代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Spring?boot?處理大文件上傳完整代碼

    Spring?boot?處理大文件上傳完整代碼

    這篇文章主要介紹了Spring?boot?處理大文件上傳,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java正則表達式驗證固定電話號碼符合性

    Java正則表達式驗證固定電話號碼符合性

    這篇文章主要介紹了Java正則表達式驗證固定電話號碼符合性的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • java開發(fā)RocketMQ消息中間件原理基礎詳解

    java開發(fā)RocketMQ消息中間件原理基礎詳解

    最近 RocketMQ 剛剛上生產環(huán)境,閑暇之時在這里做一些分享,主要目的是讓初學者能快速上手RocketMQ,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • springboot使用國產加密算法方式,sm2和sm3加解密demo

    springboot使用國產加密算法方式,sm2和sm3加解密demo

    這篇文章主要介紹了springboot使用國產加密算法方式,sm2和sm3加解密demo,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • maven打包zip包含bin下啟動腳本的完整代碼

    maven打包zip包含bin下啟動腳本的完整代碼

    這篇文章主要介紹了maven打包zip包含bin下啟動腳本,本文給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • SpringBoot項目報錯:"Error?starting?ApplicationContext...."解決辦法

    SpringBoot項目報錯:"Error?starting?ApplicationContext....

    這篇文章主要給大家介紹了關于SpringBoot項目報錯:“Error?starting?ApplicationContext.?To?display?the?conditions?report?re-run?...”的解決辦法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 基于Luhn算法的銀行卡校驗規(guī)則

    基于Luhn算法的銀行卡校驗規(guī)則

    這篇文章主要為大家介紹了基于Luhn算法的銀行卡校驗規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論

佛坪县| 黑龙江省| 台北县| 济源市| 江永县| 灌南县| 大关县| 阿合奇县| 土默特右旗| 三河市| 上虞市| 敖汉旗| 克什克腾旗| 本溪市| 阿鲁科尔沁旗| 伊宁市| 开鲁县| 临高县| 赤峰市| 沛县| 临汾市| 德阳市| 兴仁县| 宁南县| 通化县| 邵阳市| 万州区| 凤庆县| 辰溪县| 遵义市| 当阳市| 专栏| 乌兰浩特市| 迁西县| 胶南市| 根河市| 泽普县| 敦化市| 万源市| 芒康县| 本溪|