日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

JVM由那些部分組成,運行流程是什么?

來源: 責編: 時間:2023-12-05 17:10:17 271觀看
導讀圖片思考: JVM由那些部分組成,運行流程是什么?1.JVM由那些部分組成,運行流程是什么?JVM是什么好處:一次編寫,到處運行自動內存管理,垃圾回收機制圖片思考:JVM由哪些部分組成,運行流程是什么?圖片從圖中可以看出 JVM 的主要組


mlS28資訊網——每日最新資訊28at.com

圖片圖片mlS28資訊網——每日最新資訊28at.com

思考: JVM由那些部分組成,運行流程是什么?mlS28資訊網——每日最新資訊28at.com

1.JVM由那些部分組成,運行流程是什么?

JVM是什么

好處:mlS28資訊網——每日最新資訊28at.com

一次編寫,到處運行mlS28資訊網——每日最新資訊28at.com

自動內存管理,垃圾回收機制mlS28資訊網——每日最新資訊28at.com

圖片圖片mlS28資訊網——每日最新資訊28at.com

思考:JVM由哪些部分組成,運行流程是什么?mlS28資訊網——每日最新資訊28at.com

圖片圖片mlS28資訊網——每日最新資訊28at.com

從圖中可以看出 JVM 的主要組成部分mlS28資訊網——每日最新資訊28at.com

ClassLoader(類加載器)mlS28資訊網——每日最新資訊28at.com

Runtime Data Area(運行時數據區,內存分區)mlS28資訊網——每日最新資訊28at.com

Execution Engine(執行引擎)mlS28資訊網——每日最新資訊28at.com

Native Method Library(本地庫接口)mlS28資訊網——每日最新資訊28at.com

運行流程:mlS28資訊網——每日最新資訊28at.com

1.類加載器(ClassLoader):把Java代碼轉換為字節碼mlS28資訊網——每日最新資訊28at.com

2.運行時數據區(Runtime Data Area):把字節碼加載到內存中,而字節碼文件只是JVM的一套指令集規范,并不能直接交給底層系統去執行,而是有執行引擎運行mlS28資訊網——每日最新資訊28at.com

3.執行引擎(Execution Engine):將字節碼翻譯為底層系統指令,再交由CPU執行去執行,此時需要調用其他語言的本地庫接口(Native Method Library)來實現整個程序的功能。mlS28資訊網——每日最新資訊28at.com

2. 什么是程序計數器?

程序計數器:線程私有的,內部保存的字節碼的行號。用于記錄正在執行的字節碼指令的地址。mlS28資訊網——每日最新資訊28at.com

javap -verbose  xx.class    打印堆棧大小,局部變量的數量和方法的參數。mlS28資訊網——每日最新資訊28at.com

圖片圖片mlS28資訊網——每日最新資訊28at.com

java虛擬機對于多線程是通過線程輪流切換并且分配線程執行時間。在任何的一個時間點上,一個處理器只會處理執行一個線程,如果當前被執行的這個線程它所分配的執行時間用完了【掛起】。處理器會切換到另外的一個線程上來進行執行。并且這個線程的執行時間用完了,接著處理器就會又來執行被掛起的這個線程。mlS28資訊網——每日最新資訊28at.com

那么現在有一個問題就是,當前處理器如何能夠知道,對于這個被掛起的線程,它上一次執行到了哪里?那么這時就需要從程序計數器中來回去到當前的這個線程他上一次執行的行號,然后接著繼續向下執行。mlS28資訊網——每日最新資訊28at.com

程序計數器是JVM規范中唯一一個沒有規定出現OOM的區域,所以這個空間也不會進行GCmlS28資訊網——每日最新資訊28at.com

3. 你能給我詳細的介紹Java堆嗎?

Java堆是Java虛擬機(JVM)運行時數據區的一部分,線程共享的區域:主要用來保存對象實例,數組等,當堆中沒有內存空間可分配給實例,也無法再擴展時,則拋出OutOfMemoryError異常。mlS28資訊網——每日最新資訊28at.com

圖片圖片mlS28資訊網——每日最新資訊28at.com

Java堆的一些重要信息:mlS28資訊網——每日最新資訊28at.com

年輕代: 年輕代被劃分為三部分,Eden區和兩個大小嚴格相同的Survivor區,根據JVM的策略,在經過幾次垃圾收集后,任然存活于Survivor的對象將被移動到老年代區間。mlS28資訊網——每日最新資訊28at.com

老年代: 在新生代中經歷了一些輪次的對象最終會被晉升到老年代。老年代使用不同的垃圾收集算法,通常采用"標記-清理"或"標記-整理"的方式進行垃圾回收。mlS28資訊網——每日最新資訊28at.com

持久代: 在Java 8之前的版本中,持久代用于存儲類信息、方法信息等。從Java 8開始,持久代被元空間(Metaspace)取代,類信息被存儲在本地內存中。mlS28資訊網——每日最新資訊28at.com

元空間: 保存的類信息、靜態變量、常量、編譯后的代碼mlS28資訊網——每日最新資訊28at.com

圖片圖片mlS28資訊網——每日最新資訊28at.com

為了避免方法區出現OOM,所以在java8中將堆上的方法區【永久代】給移動到了本地內存上,重新開辟了一塊空間,叫做元空間。那么現在就可以避免掉OOM的出現了。mlS28資訊網——每日最新資訊28at.com

元空間(MetaSpace)介紹

在 HotSpot JVM 中,永久代( ≈ 方法區)中用于存放類和方法的元數據以及常量池,比如Class 和 Method。每當一個類初次被加載的時候,它的元數據都會放到永久代中。mlS28資訊網——每日最新資訊28at.com

永久代是有大小限制的,因此如果加載的類太多,很有可能導致永久代內存溢出,即OutOfMemoryError,為此不得不對虛擬機做調優。mlS28資訊網——每日最新資訊28at.com

那么,Java 8 中 PermGen 為什么被移出 HotSpot JVM 了?mlS28資訊網——每日最新資訊28at.com

官網給出了解釋:http://openjdk.java/jeps/122mlS28資訊網——每日最新資訊28at.com

This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.移除永久代是為融合HotSpot JVM與 JRockit VM而做出的努力,因為JRockit沒有永久代,不需要配置永久代。

1)由于 PermGen 內存經常會溢出,引發OutOfMemoryError,因此 JVM 的開發者希望這一塊內存可以更靈活地被管理,不要再經常出現這樣的 OOM。mlS28資訊網——每日最新資訊28at.com

2)移除 PermGen 可以促進 HotSpot JVM 與 JRockit VM 的融合,因為 JRockit 沒有永久代。mlS28資訊網——每日最新資訊28at.com

準確來說,Perm 區中的字符串常量池被移到了堆內存中是在 Java7 之后,Java 8 時,PermGen 被元空間代替,其他內容比如類元信息、字段、靜態屬性、方法、常量等都移動到元空間區。比如 java/lang/Object 類元信息、靜態屬性 System.out、整型常量等。mlS28資訊網——每日最新資訊28at.com

元空間的本質和永久代類似,都是對 JVM 規范中方法區的實現。不過元空間與永久代之間最大的區別在于:元空間并不在虛擬機中,而是使用本地內存。因此,默認情況下,元空間的大小僅受本地內存限制。mlS28資訊網——每日最新資訊28at.com

4. 什么是虛擬機棧?

Java Virtual machine Stacks (java 虛擬機棧)mlS28資訊網——每日最新資訊28at.com

  • 每個線程運行時所需要的內存,稱為虛擬機棧,先進后出
  • 每個棧由多個棧幀(frame)組成,對應著每次方法調用時所占用的內存
  • 每個線程只能有一個活動棧幀,對應著當前正在執行的那個方法

圖片圖片mlS28資訊網——每日最新資訊28at.com

1)垃圾回收是否涉及棧內存?mlS28資訊網——每日最新資訊28at.com

垃圾回收主要指就是堆內存,當棧幀彈棧以后,內存就會釋放mlS28資訊網——每日最新資訊28at.com

2)棧內存分配越大越好嗎?mlS28資訊網——每日最新資訊28at.com

未必,默認的棧內存通常為1024kmlS28資訊網——每日最新資訊28at.com

棧幀過大會導致線程數變少,例如,機器總內存為512m,目前能活動的線程數則為512個,如果把棧內存改為2048k,那么能活動的棧幀就會減半mlS28資訊網——每日最新資訊28at.com

3)方法內的局部變量是否線程安全?mlS28資訊網——每日最新資訊28at.com

  • 如果方法內局部變量沒有逃離方法的作用范圍,它是線程安全的
  • 如果是局部變量引用了對象,并逃離方法的作用范圍,需要考慮線程安全

棧內存溢出情況mlS28資訊網——每日最新資訊28at.com

  • 棧幀過多導致棧內存溢出,典型問題:遞歸調用

總結:mlS28資訊網——每日最新資訊28at.com

1)堆解決的是對象實例存儲的問題,垃圾回收器管理的主要區域。mlS28資訊網——每日最新資訊28at.com

2.)方法區可以認為是堆的一部分,用于存儲已被虛擬機加載的信息,常量、靜態變量、即時編譯器編譯后的代碼。mlS28資訊網——每日最新資訊28at.com

3)棧解決的是程序運行的問題,棧里面存的是棧幀,棧幀里面存的是局部變量表、操作數棧、動態鏈接、方法出口等信息。mlS28資訊網——每日最新資訊28at.com

4)本地方法棧與棧功能相同,本地方法棧執行的是本地方法,一個Java調用非Java代碼的接口。mlS28資訊網——每日最新資訊28at.com

5)程序計數器(PC寄存器) 程序計數器中存放的是當前線程所執行的字節碼的行數。JVM工作時就是通過改變這個計數器的值來選取下一個需要執行的字節碼指令。mlS28資訊網——每日最新資訊28at.com

5.  JVM組成面試題

面試官:JVM由那些部分組成,運行流程是什么?mlS28資訊網——每日最新資訊28at.com

候選人:mlS28資訊網——每日最新資訊28at.com

在JVM中共有四大部分,分別是ClassLoader(類加載器)、Runtime Data Area(運行時數據區,內存分區)、Execution Engine(執行引擎)、Native Method Library(本地庫接口)mlS28資訊網——每日最新資訊28at.com

它們的運行流程是:mlS28資訊網——每日最新資訊28at.com

第一,類加載器(ClassLoader)把Java代碼轉換為字節碼mlS28資訊網——每日最新資訊28at.com

第二,運行時數據區(Runtime Data Area)把字節碼加載到內存中,而字節碼文件只是JVM的一套指令集規范,并不能直接交給底層系統去執行,而是有執行引擎運行mlS28資訊網——每日最新資訊28at.com

第三,執行引擎(Execution Engine)將字節碼翻譯為底層系統指令,再交由CPU執行去執行,此時需要調用其他語言的本地庫接口(Native Method Library)來實現整個程序的功能。mlS28資訊網——每日最新資訊28at.com

面試官:好的,你能詳細說一下 JVM 運行時數據區嗎?mlS28資訊網——每日最新資訊28at.com

候選人:mlS28資訊網——每日最新資訊28at.com

嗯,好~mlS28資訊網——每日最新資訊28at.com

運行時數據區包含了堆、方法區、棧、本地方法棧、程序計數器這幾部分,每個功能作用不一樣。mlS28資訊網——每日最新資訊28at.com

  • 堆解決的是對象實例存儲的問題,垃圾回收器管理的主要區域。
  • 方法區可以認為是堆的一部分,用于存儲已被虛擬機加載的信息,常量、靜態變量、即時編譯器編譯后的代碼。
  • 棧解決的是程序運行的問題,棧里面存的是棧幀,棧幀里面存的是局部變量表、操作數棧、動態鏈接、方法出口等信息。
  • 本地方法棧與棧功能相同,本地方法棧執行的是本地方法,一個Java調用非Java代碼的接口。
  • 程序計數器(PC寄存器)程序計數器中存放的是當前線程所執行的字節碼的行數。JVM工作時就是通過改變這個計數器的值來選取下一個需要執行的字節碼指令。

面試官:好的,你再詳細介紹一下程序計數器的作用?mlS28資訊網——每日最新資訊28at.com

候選人:mlS28資訊網——每日最新資訊28at.com

嗯,是這樣~~mlS28資訊網——每日最新資訊28at.com

java虛擬機對于多線程是通過線程輪流切換并且分配線程執行時間。在任何的一個時間點上,一個處理器只會處理執行一個線程,如果當前被執行的這個線程它所分配的執行時間用完了【掛起】。處理器會切換到另外的一個線程上來進行執行。并且這個線程的執行時間用完了,接著處理器就會又來執行被掛起的這個線程。這時候程序計數器就起到了關鍵作用,程序計數器在來回切換的線程中記錄他上一次執行的行號,然后接著繼續向下執行。mlS28資訊網——每日最新資訊28at.com

面試官:你能給我詳細的介紹Java堆嗎?mlS28資訊網——每日最新資訊28at.com

候選人:mlS28資訊網——每日最新資訊28at.com

Java中的堆術語線程共享的區域。主要用來保存對象實例,數組等,當堆中沒有內存空間可分配給實例,也無法再擴展時,則拋出OutOfMemoryError異常。mlS28資訊網——每日最新資訊28at.com

在JAVA8中堆內會存在年輕代、老年代mlS28資訊網——每日最新資訊28at.com

1)Young(新生代)區被劃分為三部分,Eden區和兩個大小嚴格相同的Survivor區,其中,Survivor區間中,某一時刻只有其中一個是被使用的,另外一個留做垃圾收集時復制對象用。在Eden區變滿的時候, GC就會將存活的對象移到空閑的Survivor區間中,根據JVM的策略,在經過幾次垃圾收集后,任然存活于Survivor的對象將被移動到Tenured區間。mlS28資訊網——每日最新資訊28at.com

2)Tenured(老年代)區主要保存生命周期長的對象,一般是一些老的對象,當一些對象在Young復制轉移一定的次數以后,對象就會被轉移到Tenured區。mlS28資訊網——每日最新資訊28at.com

面試官:什么是虛擬機棧mlS28資訊網——每日最新資訊28at.com

候選人:mlS28資訊網——每日最新資訊28at.com

虛擬機棧是描述的是方法執行時的內存模型,是線程私有的,生命周期與線程相同,每個方法被執行的同時會創建棧楨。保存執行方法時的局部變量、動態連接信息、方法返回地址信息等等。方法開始執行的時候會進棧,方法執行完會出棧【相當于清空了數據】,所以這塊區域不需要進行 GC。mlS28資訊網——每日最新資訊28at.com

面試官:能說一下堆棧的區別是什么嗎?mlS28資訊網——每日最新資訊28at.com

候選人:mlS28資訊網——每日最新資訊28at.com

有這幾個區別mlS28資訊網——每日最新資訊28at.com

第一,棧內存一般會用來存儲局部變量和方法調用,但堆內存是用來存儲Java對象和數組的的。堆會GC垃圾回收,而棧不會。mlS28資訊網——每日最新資訊28at.com

第二、棧內存是線程私有的,而堆內存是線程共有的。mlS28資訊網——每日最新資訊28at.com

第三、兩者異常錯誤不同,但如果棧內存或者堆內存不足都會拋出異常。mlS28資訊網——每日最新資訊28at.com

棧空間不足:java.lang.StackOverFlowError。mlS28資訊網——每日最新資訊28at.com

堆空間不足:java.lang.OutOfMemoryError。mlS28資訊網——每日最新資訊28at.com


mlS28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-38319-0.htmlJVM由那些部分組成,運行流程是什么?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 五個堪稱瑰寶級的 Python 庫,建議收藏!

下一篇: 2024年新興網絡安全技術應用趨勢簡析

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • 分布式系統中的CAP理論,面試必問,你理解了嘛?

    對于剛剛接觸分布式系統的小伙伴們來說,一提起分布式系統,就感覺高大上,深不可測。而且看了很多書和視頻還是一臉懵逼。這篇文章主要使用大白話的方式,帶你理解一下分布式系統
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 一條抖音4億人圍觀 ! 這家MCN比無憂傳媒還野

    作者:Hiu 來源:互聯網品牌官01 擦邊少女空降熱搜,幕后推手曝光被網友譽為“純欲天花板”的女網紅井川里予,近期因為一組哥特風照片登上熱搜,引發了一場互聯網世界關于
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起“馮提莫”這個名字,很多網友或許聽過,但應該不記得她是哪位主播了。其實,作為曾經的“斗魚一姐”,馮提莫在游戲直播的年代影響力不輸于現
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發布的朋友圈
  • 榮耀Magic4 至臻版 首創智慧隱私通話 強勁影音系統

    2022年第一季度臨近尾聲,在該季度內,許多品牌陸續發布自己的最新產品,讓大家從全新的角度來了解當今的手機技術。手機是電子設備中,更新迭代十分迅速的一款產品,基
Top 主站蜘蛛池模板: 九龙城区| 永宁县| 乌鲁木齐市| 丘北县| 旬邑县| 嘉荫县| 伊春市| 建平县| 巨鹿县| 义乌市| 海晏县| 谢通门县| 揭西县| 通许县| 哈巴河县| 石屏县| 五寨县| 眉山市| 衢州市| 弥渡县| 巨鹿县| 霞浦县| 林芝县| 饶河县| 榆社县| 南平市| 邻水| 姚安县| 尼玛县| 凤冈县| 蒲城县| 邢台县| 阿尔山市| 永兴县| 泰安市| 新密市| 乡宁县| 开鲁县| 防城港市| 临桂县| 通州市|