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

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 深入了解Java虛擬機

深入了解Java虛擬機

更新時間:2021-05-07 11:40:57 來源:動力節點 瀏覽1129次

1.為什么要學習Java虛擬機?

這里我們使用舉例來說明為什么要學習Java虛擬機,其實這個問題就和為什么要學習數據結構和算法是一個道理,工欲善其事,必先利其器。曾經的我經常害怕處理內存溢出的問題,因為不知道他為什么會出現這個問題,當我在看了這本書以后明白了垃圾回收算法,以及JVM是如何幫助我們處理GC的,這個時候當出現這個問題的時候我就明白需要查找GC Root,或者查看GC日志,去查找這個問題的根源,這樣就能處理這些問題。還有以前的在理解重載和重構的時候只是在表面去理解,當我看完這本書明白,原來在方法調用時候這些東西就生成處理,另外還有一個new到底經歷那些事情等等一序列問題,如果你還在就糾結一些問題為什么是這么處理的時候那你就去看Java虛擬機吧,或許會有不一樣的感悟,以上就是為什么要學習Java虛擬機的原因。

2.需要了解哪些方面?

這里面我們來談一下GC,要探討這個問題我們需要從3個方面入手:

(1)JVM是如何分配內存的?

1)線程計數器,是一塊較小的內存空間,用來指定當前線程執行字節碼的行數,每個線程計數器都是私有的,因為每個線程都需要記錄執行的行數;這里解釋一下為什么每個線程都需要一個線程計數器,JVM的多線程是通過線程輪流切換分配執行時間來實現的,在任何時刻,每個處理器都只會執行一個線程中的指令,當線程進行切換的時,為了線程能恢復當正確的位置,所以每個線程必須有個獨立的線程計數器,這樣才能保證線程之間不互相影響。

這里注意下,如果線程執行是一個Java方法的時候,計數器記錄的是虛擬機字節碼指令的地址;當執行的是Native的方法的時候,計數器指令為空;該內存區域是Java虛擬機唯一沒有規定任何OutOfMemoryError的區域。

2)Java虛擬棧,這個也是一個線程私有的,生命周期與線程是同步的,每個方法在執行的同時,都會創建一個棧幀,用于存儲局部變量表,操作數棧,動態鏈接,方法出入口等信息,每個方法的調用到執行完成的過程就是一個棧幀入棧到出棧的過程;

這里解釋一下局部變量表,局部變量表存儲方法相關的局部變量,包括基本數據,對象引用和返回地址等。在局部變量表中,只有long和double類型會占用2個局部變量空間(Slot,對于32位機器,一個Slot就是32個bit),其它都是1個Slot。需要注意的是,局部變量表是在編譯時就已經確定好的,方法運行所需要分配的空間在棧幀中是完全確定的,在方法的生命周期內都不會改變。這部分東西我還想等下一篇博客的時候我想仔細說一下字節碼的執行過程;

虛擬機棧規定了2種異常情況,一種是線程請求棧的深度大于虛擬機棧所允許的深度,這時候將會拋出StackOverflowError異常,如果當Java虛擬機允許動態擴展虛擬機棧的時候,當擴展的時候沒辦法分配到內存的時候就會報OutOfMemoryError異常;

3)本地方法棧,與虛擬機棧執行的基本相同,唯一的區別就是虛擬機棧是執行Java方法的,本地方法棧是執行native方法的;

4)Java堆,堆區是Java虛擬機所管理的內存中最大的一塊,Java堆是被所有線程共享的內存區域,主要存儲對象的實例。

當堆中沒有內存完成實例分配,并且堆無法擴展的時候,將會拋出OutOfMemoryError異常;當前虛擬機都是可以擴展的;

5)方法區,這個也是線程共享的內存區域,存儲被虛擬機加載的類信息、常量、靜態變量、即時編譯的代碼數據等;

方法區在物理上也是不需要連續的,可以選擇固定大小或者擴展的大小,還可以選擇不實現垃圾收集,方法區的垃圾回收是比較少的,這就是方法區為什么被稱為永久區的原因,但是方法區也是可以執行回收的,該區域主要是針對常量池和類型的卸載;在方法區也規定當方法區無法滿足內存分布的時候,將會拋出OutOfMemoryError異常;

運行時常量是方法區的一部分,常量池主要用于存放編譯生成的各種字面量和符合引用,由于常量池屬于方法區的一部分,所以當常量池沒有內存空間的時候就拋出OutOfMemoryError異常;

6)直接內存,不是虛擬機運行時的一部分,可以直接訪問堆外的內存;所以當內存空間無法動態擴展的時候就會出現OutOfMemoryError異常;

以上基本是JVM內存分布的內容,簡單的理解水滿則溢出就是這個道理,系統的整個空間是一個大的容器,分不同的部分或者桶去分擔整個容量,當那個桶不夠的時候自然會溢出。

(2)如何才能保證正確的回收?

回收是已經沒有用的對象,那怎么判斷一個對象沒用引用?這里需要簡單介紹2種方法:引用計數法和可達性分析算法;

這里簡單說一下引用計數法:對象中添加一個引用計數器,每當有一個地方引用計數器就增加1,引用失效就減少1,計數器為0就不可用;缺點就在于無法處理對象直接相互引用的問題,因為相互引用以后無法使計數器為0,所以無法回收;

可達性分析算法,也就是我們常說的GC Root,,當一個對象沒有與任何引用鏈相連的時候,就可以對該對象進行回收

(3)JVM什么情況下觸發GC以及GC的方式?

當內存空間不足的時候就需要觸發GC,GC回收的時候采用的是分代收集的算法,主要分為年輕代和老年代,接下來我們簡單介紹一下這2種方式:

年輕代:當一個對象被創建的時候,內存分配首先分配在年輕代,大部分對象創建以后都不再使用,對象很快變得不可達,就是對象無用,由于垃圾是被年輕代清理掉的,所以被叫做Minor GC或者Young GC。

老年代:對象如果在年輕代存活了足夠長的時間而沒有被清理掉(即在幾次Young GC后存活了下來),則會被復制到年老代,年老代的空間一般比年輕代大,能存放更多的對象,在年老代上發生的GC次數也比年輕代少。當年老代內存不足時,將執行Major GC,也叫 Full GC。

以上就是動力節點小編介紹的"深入了解Java虛擬機"的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為您服務。

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 中文国产成人精品久久水 | 成人香蕉网 | 亚洲免费视频网址 | 5g国产精品影院天天5g天天爽 | 久久日韩精品激情 | 国产精品福利视频免费观看 | 日本网站在线播放 | 色偷偷亚洲天堂 | 五月激情六月婷婷 | 亚洲最大成人 | 全网毛片 | 欧美在线一区二区三区精品 | 日韩国产欧美成人一区二区影院 | 国产成人免费 | 国产永久 | 日韩在线国产精品 | 国产精品日日做人人爱 | 久久精品国产亚洲欧美 | 青青青手机视频 | 在线观看 日韩 | 中文字幕久久亚洲一区 | 日本一级一片免在线观看 | 久久中文在线 | 国产成人久久久精品毛片 | 婷婷亚洲五月色综合 | 一区二区国产精品 | 99re热视频在线 | 亚洲欧美乱综合图片区小说区 | 久久国产精品自由自在 | 波多野结衣一区免费作品 | 日韩高清一区二区三区不卡 | 美利坚永久精品视频在线观看 | 91国自产精品中文字幕亚洲 | 黄色毛片免费 | 在线观看视频国产 | 国产一及毛片 | 日韩私人影院 | 最近中文字幕无吗高清视频 | 最新精品国产 | 色婷婷色综合激情国产日韩 | 亚洲欧美高清 |