大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 學習Java編程,Java虛擬機內部構造

學習Java編程,Java虛擬機內部構造

更新時間:2019-10-31 09:10:51 來源:動力節點 瀏覽2381次



  我們都知道虛擬機的內存劃分了多個區域,并不是一張大餅。那么為什么要劃分為多塊區域呢,直接搞一塊區域,所有用到內存的地方都往這塊區域里扔不就行了,豈不痛快。是的,如果不進行區域劃分,扔的時候確實痛快,可用的時候再去找怎么辦呢,這就引入了第一個問題,分類管理,類似于衣柜,系統磁盤等等,為了方便查找,我們會進行分區分類。另外如果不進行分區,內存用盡了怎么辦呢?這里就引入了內存劃分的第二個原因,就是為了方便內存的回收。如果不分,回收內存需要全部內存掃描,那就慢死了,內存根據不同的使用功能分成不同的區域,那么內存回收也就可以根據每個區域的特定進行回收,比如像棧內存中的棧幀,隨著方法的執行棧幀進棧,方法執行完畢就出棧了,而對于像堆內存的回收就需要使用經典的回收算法來進行回收了,所以看起來分類這么麻煩,其實是大有好處的。


  提到虛擬機的內存結構,可能首先想起來的就是堆棧。對象分配到堆上,棧上用來分配對象的引用以及一些基本數據類型相關的值。但是·虛擬機的內存結構遠比此要復雜的多。除了我們所認識的(還沒有認識完全)的堆棧以外,還有程序計數器,本地方法棧和方法區。我們平時所說的棧內存,一般是指的棧內存中的局部變量表。下面是官方所給的虛擬機的內存結構圖

  

image.png

  從圖中可以看到有5大內存區域,按照是否被線程所共享可分為兩部分,一部分是線程獨占區域,包括Java棧,本地方法棧和程序計數器。還有一部分是被線程所共享的,包括方法區和堆。什么是線程共享和線程獨占呢,非常好理解,我們知道每一個Java進行都會有多個線程同時運行,那么線程共享區的這片區域就是被所有線程一起使用的,不管有多少個線程,這片空間始終就這一個。而線程的獨占區,是每個線程都有這么一份內存空間,每個線程的這片空間都是獨有的,有多少個線程就有多少個這么個空間。上圖的區域的大小并不代表實際內存區域的大小,實際運行過程中,內存區域的大小也是可以動態調整的。下面來具體說說每一個區域的主要功能。


  程序計數器,我們在寫代碼的過程中,開發工具一般都會給我們標注行號方便查看和閱讀代碼。那么在程序在運行過程中也有一個類似的行號方便虛擬機的執行,就是程序計數器,在c語言中,我們知道會有一個goto語句,其實就是跳轉到了指定的行,這個行號就是程序計數器。存儲的就是程序下一條所執行的指令。這部分區域是線程所獨享的區域,我們知道線程是一個順序執行流,每個線程都有自己的執行順序,如果所有線程共用一個程序計數器,那么程序執行肯定就會出亂子。為了保證每個線程的執行順序,所以程序計數器是被單個線程所獨顯的。程序計數器這塊內存區域是唯一一個在jvm規范中沒有規定內存溢出的。


  java虛擬機棧,java虛擬機棧是程序運行的動態區域,每個方法的執行都伴隨著棧幀的入棧和出棧。棧幀也叫過程活動記錄,是編譯器用來實現過程/函數調用的一種數據結構。棧幀中包括了局部變量表,操作數棧,方法返回地址以及額外的一些附加信息,在編譯過程中,局部變量表的大小已經確定,操作數棧深度也已經確定,因此棧幀在運行的過程中需要分配多大的內存是固定的,不受運行時影響。對于沒有逃逸的對象也會在棧上分配內存,對象的大小其實在運行時也是確定的,因此即使出現了棧上內存分配,也不會導致棧幀改變大小。


  一個線程中,可能調用鏈會很長,很多方法都同時處于執行狀態。對于執行引擎來講,活動線程中,只有棧頂的棧幀是最有效的,稱為當前棧幀,這個棧幀所關聯的方法稱為當前方法。執行引擎所運行的字節碼指令僅對當前棧幀進行操作。


image.png

  局部變量表:我們平時所說的棧內存一般就是指棧內存中的局部變量表。這里主要是存儲變量所用。對于基本數據類型直接存儲其值,對于引用數據類型則存儲其地址。局部變量表的最小存儲單位是Slot,每個Slot都能存放一個boolean、byte、char、short、int、float、reference或returnAddress類型的數據。


  既然前面提到了數據類型,在此順便說一下,一個Slot可以存放一個32位以內的數據類型,Java中占用32位以內的數據類型有boolean、byte、char、short、int、float、reference和returnAddress八種類型。前面六種不需要多解釋,大家都認識,而后面的reference是對象的引用。虛擬機規范既沒有說明它的長度,也沒有明確指出這個引用應有怎樣的結構,但是一般來說,虛擬機實現至少都應當能從此引用中直接或間接地查找到對象在Java堆中的起始地址索引和方法區中的對象類型數據。而returnAddress是為字節碼指令jsr、jsr_w和ret服務的,它指向了一條字節碼指令的地址。


  對于64位的數據類型,虛擬機會以高位在前的方式為其分配兩個連續的Slot空間。Java語言中明確規定的64位的數據類型只有long和double兩種(reference類型則可能是32位也可能是64位)。值得一提的是,這里把long和double數據類型讀寫分割為兩次32讀寫的做法類似。不過,由于局部變量表建立在線程的堆棧上,是線程私有的數據,無論讀寫兩個連續的Slot是否是原子操作,都不會引起數據安全問題。


  操作數棧是一個后入先出(LastInFirstOut,LIFO)棧。同局部變量表一樣,操作數棧的最大深度也在編譯的時候被寫入到字節碼文件中,關于字節碼文件,后面我會具體的來描述。操作數棧的每一個元素可以是任意的Java數據類型,包括long和double。32位數據類型所占的棧容量為1,64位數據類型所占的棧容量為2。在方法執行的任何時候,操作數棧的深度都不會超過在max_stacks數據項中設定的最大值。


  當一個方法剛剛開始執行的時候,這個方法的操作數棧是空的,在方法的執行過程中,會有各種字節碼指令向操作數棧中寫入和提取內容,也就是入棧出棧操作。例如,在做算術運算的時候是通過操作數棧來進行的,又或者在調用其他方法的時候是通過操作數棧來進行參數傳遞的。


  舉個例子,整數加法的字節碼指令iadd在運行的時候要求操作數棧中最接近棧頂的兩個元素已經存入了兩個int型的數值,當執行這個指令時,會將這兩個int值和并相加,然后將相加的結果入棧。


  操作數棧中元素的數據類型必須與字節碼指令的序列嚴格匹配,在編譯程序代碼的時候,編譯器要嚴格保證這一點,在類校驗階段的數據流分析中還要再次驗證這一點。再以上面的iadd指令為例,這個指令用于整型數加法,它在執行時,最接近棧頂的兩個元素的數據類型必須為int型,不能出現一個long和一個float使用iadd命令相加的情況。


  本地方法棧與虛擬機棧所發揮的作用是非常相似的,其區別不過是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是為虛擬機使用到的Native方法服務。虛擬機規范中對本地方法棧中的方法使用的語言、使用方式與數據結構并沒有強制規定,因此具體的虛擬機可以自由實現它。甚至有的虛擬機(譬如SunHotSpot虛擬機)直接就把本地方法棧和虛擬機棧合二為一。與虛擬機棧一樣,本地方法棧區域也會拋出StackOverflowError和OutOfMemoryError異常。


  方法區經常會被人稱之為永久代,但這倆并不是一個概念。首先永久代的概念僅僅在HotSpot虛擬機中存在,不幸的是,在jdk8中,Hotspot去掉了永久代這一說法,使用了NativeMemory,也就是Metaspace空間。那么方法區是干嘛的呢?我們可以這么理解,我們要運行Java代碼,首先需要編譯,然后才能運行。在運行的過程中,我們知道首先需要加載字節碼文件。也就是說要把字節碼文件加載到內存中。好了,問題就來了,字節碼文件放到內存中的什么地方呢,就是方法區中。當然除了編譯后的字節碼之外,方法區中還會存放常量,靜態變量以及及時編譯器編譯后的代碼等數據。


  堆,一般來講堆內存是Java虛擬機中最大的一塊內存區域,同方法區一樣,是被所有線程所共享的區域。此區域所存在的唯一目的就存放對象的實例(對象實例并不一定全部在堆中創建)。堆內存是垃圾收集器主要光顧的區域,一般來講根據使用的垃圾收集器的不同,堆中還會劃分為一些區域,比如新生代和老年代。新生代還可以再劃分為Eden,Survivor等區域。另外為了性能和安全性的角度,在堆中還會為線程劃分單獨的區域,稱之為線程分配緩沖區。更細致的劃分是為了讓垃圾收集器能夠更高效的工作,提高垃圾收集的效率。


  以上就是動力節點Java培訓機構小編介紹的“學習Java編程,Java虛擬機內部構造”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。


  相關內容


  java虛擬機內存管理


  Java虛擬機以及跨平臺原理怎樣實現


  學習Java虛擬機,這五本Java書籍不要錯過


  


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 99久久www免费人成精品 | 精品欧美成人bd高清在线观看 | 日韩一区二区不卡 | 日韩欧美一卡二区 | 色综合免费视频 | 9re视频这里只有精品 | 国产欧美日韩精品第二区 | 国产亚洲精品线观看77 | 国产美女白丝袜精品_a不卡 | 水中色av综合 | 免费观看一级欧美在线视频 | 色 综合 欧美 亚洲 国产 | 成年人黄色小视频 | www.伊人| 久久久精品久久久久特色影视 | 欧美一区二区三区视频在线 | 99热久 | 婷婷综合网站 | 亚洲精品第一国产麻豆 | 中文字幕专区高清在线观看 | 欧美一级毛片特黄大 | 国产亚洲综合一区二区在线 | 国产99r视频精品免费观看 | 久久国产视频网站 | 青青青在线视频人视频在线 | 欧美爱爱小视频 | 亚洲精品一区二区四季 | 成人精品mv视频在线观看 | 免费污视频在线观看 | 天天干视频在线 | 日韩美女一级毛片 | 999成人精品视频在线 | 中文字幕日韩视频 | 免费h片在线观看网址最新 免费v片在线观看无遮挡 | 国产成人精品免费视频大全办公室 | 日韩欧美在线观看视频 | 精品国产高清自在线一区二区三区 | 一级毛片免费不卡 | 欧美日韩中文字幕在线手机版本 | 欧美一级高清在线观看 | 亚洲国产成人精品一区91 |