国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

面試官:說說JVM內存整體結構?線程私有還是共享的?

開發 前端
一旦對象在 TLAB 空間分配內存失敗時,JVM 就會嘗試著通過使用加鎖機制確保數據操作的原子性,從而直接在 Eden 空間中分配內存。

JVM 整體架構,中間部分就是 Java 虛擬機定義的各種運行時數據區域。

圖片圖片

Java 虛擬機定義了若干種程序運行期間會使用到的運行時數據區,其中有一些會隨著虛擬機啟動而創建,隨著虛擬機退出而銷毀。另外一些則是與線程一一對應的,這些與線程一一對應的數據區域會隨著線程開始和結束而創建和銷毀。

線程私有:程序計數器、虛擬機棧、本地方法區

線程共享:堆、方法區, 堆外內存(Java7的永久代或JDK8的元空間、代碼緩存)

什么是程序計數器(線程私有)?

PC 寄存器用來存儲指向下一條指令的地址,即將要執行的指令代碼。由執行引擎讀取下一條指令。

PC寄存器為什么會被設定為線程私有的?

多線程在一個特定的時間段內只會執行其中某一個線程方法,CPU會不停的做任務切換,這樣必然會導致經常中斷或恢復。為了能夠準確的記錄各個線程正在執行的當前字節碼指令地址,所以為每個線程都分配了一個PC寄存器,每個線程都獨立計算,不會互相影響。

什么是虛擬機棧(線程私有)?

主管 Java 程序的運行,它保存方法的局部變量、部分結果,并參與方法的調用和返回。每個線程在創建的時候都會創建一個虛擬機棧,其內部保存一個個的棧幀(Stack Frame),對應著一次次 Java 方法調用,是線程私有的,生命周期和線程一致。

特點?

  1. 棧是一種快速有效的分配存儲方式,訪問速度僅次于程序計數器
  2. JVM 直接對虛擬機棧的操作只有兩個:每個方法執行,伴隨著入棧(進棧/壓棧),方法執行結束出棧
  3. 棧不存在垃圾回收問題
  4. 可以通過參數-Xss來設置線程的最大棧空間,棧的大小直接決定了函數調用的最大可達深度

該區域有哪些異常?

  1. 如果采用固定大小的 Java 虛擬機棧,那每個線程的 Java 虛擬機棧容量可以在線程創建的時候獨立選定。如果線程請求分配的棧容量超過 Java 虛擬機棧允許的最大容量,Java 虛擬機將會拋出一個 StackOverflowError 異常
  2. 如果 Java 虛擬機棧可以動態擴展,并且在嘗試擴展的時候無法申請到足夠的內存,或者在創建新的線程時沒有足夠的內存去創建對應的虛擬機棧,那 Java 虛擬機將會拋出一個OutOfMemoryError異常

棧幀的內部結構?

  1. 局部變量表(Local Variables)
  2. 操作數棧(Operand Stack)(或稱為表達式棧)
  3. 動態鏈接(Dynamic Linking):指向運行時常量池的方法引用
  4. 方法返回地址(Return Address):方法正常退出或異常退出的地址
  5. 一些附加信息

圖片圖片

Java虛擬機棧如何進行方法計算的?

以如下代碼為例:

private static int add(int a, int b) {
    int c = 0;
    c = a + b;
    return c;
}

可以通過jsclass 等工具查看bytecode

圖片圖片

壓棧的步驟如下:

0:   iconst_0 // 0壓棧
1:   istore_2 // 彈出int,存放于局部變量2
2:   iload_0  // 把局部變量0壓棧
3:   iload_1  // 局部變量1壓棧
4:   iadd     //彈出2個變量,求和,結果壓棧
5:   istore_2 //彈出結果,放于局部變量2
6:   iload_2  //局部變量2壓棧
7:   ireturn  //返回

如果計算100+98的值,那么操作數棧的變化如下圖:

圖片圖片

什么是本地方法棧(線程私有)?

  • 本地方法接口

一個 Native Method 就是一個 Java 調用非 Java 代碼的接口。我們知道的 Unsafe 類就有很多本地方法。

  • 本地方法棧(Native Method Stack)

Java 虛擬機棧用于管理 Java 方法的調用,而本地方法棧用于管理本地方法的調用

什么是方法區(線程共享)?

方法區(method area)只是 JVM 規范中定義的一個概念,用于存儲類信息、常量池、靜態變量、JIT編譯后的代碼等數據,并沒有規定如何去實現它,不同的廠商有不同的實現。而永久代(PermGen)**是 **Hotspot** 虛擬機特有的概念, Java8 的時候又被**元空間取代了,永久代和元空間都可以理解為方法區的落地實現。

JDK1.8之前調節方法區大小:

-XX:PermSize=N //方法區(永久代)初始大小
-XX:MaxPermSize=N //方法區(永久代)最大大小,超出這個值將會拋出OutOfMemoryError

JDK1.8開始方法區(HotSpot的永久代)被徹底刪除了,取而代之的是元空間,元空間直接使用的是本機內存。參數設置:

-XX:MetaspaceSize=N //設置Metaspace的初始(和最小大小)
-XX:MaxMetaspaceSize=N //設置Metaspace的最大大小

棧、堆、方法區的交互關系

圖片圖片

永久代和元空間內存使用上的差異?

Java虛擬機規范中只定義了方法區用于存儲已被虛擬機加載的類信息、常量、靜態變量和即時編譯后的代碼等數據

  1. jdk1.7開始符號引用存儲在native heap中,字符串常量和靜態類型變量存儲在普通的堆區中,但分離的并不徹底,此時永久代中還保存另一些與類的元數據無關的雜項
  2. jdk8后HotSpot 原永久代中存儲的類的元數據將存儲在metaspace中,而類的靜態變量和字符串常量將放在Java堆中,metaspace是方法區的一種實現,只不過它使用的不是虛擬機內的內存,而是本地內存。在元空間中保存的數據比永久代中純粹很多,就只是類的元數據,這些信息只對編譯期或JVM的運行時有用。
  3. 永久代有一個JVM本身設置固定大小上線,無法進行調整,而元空間使用的是直接內存,受本機可用內存的限制,并且永遠不會得到java.lang.OutOfMemoryError。
  4. 符號引用沒有存在元空間中,而是存在native heap中,這是兩個方式和位置,不過都可以算作是本地內存,在虛擬機之外進行劃分,沒有設置限制參數時只受物理內存大小限制,即只有占滿了操作系統可用內存后才OOM。

堆區內存是怎么細分的?

對于大多數應用,Java 堆是 Java 虛擬機管理的內存中最大的一塊,被所有線程共享。此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例以及數據都在這里分配內存。

為了進行高效的垃圾回收,虛擬機把堆內存邏輯上劃分成三塊區域(分代的唯一理由就是優化 GC 性能):

  1. 新生帶(年輕代):新對象和沒達到一定年齡的對象都在新生代
  2. 老年代(養老區):被長時間使用的對象,老年代的內存空間應該要比年輕代更大

 

圖片

Java 虛擬機規范規定,Java 堆可以是處于物理上不連續的內存空間中,只要邏輯上是連續的即可,像磁盤空間一樣。實現時,既可以是固定大小,也可以是可擴展的,主流虛擬機都是可擴展的(通過 -Xmx 和 -Xms 控制),如果堆中沒有完成實例分配,并且堆無法再擴展時,就會拋出 OutOfMemoryError 異常。

  • 年輕代 (Young Generation)

年輕代是所有新對象創建的地方。當填充年輕代時,執行垃圾收集。這種垃圾收集稱為 Minor GC。年輕一代被分為三個部分——伊甸園(Eden Memory)和兩個幸存區(Survivor Memory,被稱為from/to或s0/s1),默認比例是8:1:1

  1. 大多數新創建的對象都位于 Eden 內存空間中
  2. 當 Eden 空間被對象填充時,執行Minor GC,并將所有幸存者對象移動到一個幸存者空間中
  3. Minor GC 檢查幸存者對象,并將它們移動到另一個幸存者空間。所以每次,一個幸存者空間總是空的
  4. 經過多次 GC 循環后存活下來的對象被移動到老年代。通常,這是通過設置年輕一代對象的年齡閾值來實現的,然后他們才有資格提升到老一代
  • 老年代(Old Generation)

舊的一代內存包含那些經過許多輪小型 GC 后仍然存活的對象。通常,垃圾收集是在老年代內存滿時執行的。老年代垃圾收集稱為 主GC(Major GC),通常需要更長的時間。

大對象直接進入老年代(大對象是指需要大量連續內存空間的對象)。這樣做的目的是避免在 Eden 區和兩個Survivor 區之間發生大量的內存拷貝

圖片圖片

JVM中對象在堆中的生命周期?

  1. 在 JVM 內存模型的堆中,堆被劃分為新生代和老年代

新生代又被進一步劃分為 Eden區 和 Survivor區,Survivor 區由 From Survivor 和 To Survivor 組成

  1. 當創建一個對象時,對象會被優先分配到新生代的 Eden 區

此時 JVM 會給對象定義一個對象年輕計數器(-XX:MaxTenuringThreshold)

  1. 當 Eden 空間不足時,JVM 將執行新生代的垃圾回收(Minor GC)

JVM 會把存活的對象轉移到 Survivor 中,并且對象年齡 +1

對象在 Survivor 中同樣也會經歷 Minor GC,每經歷一次 Minor GC,對象年齡都會+1

  1. 如果分配的對象超過了-XX:PetenureSizeThreshold,對象會直接被分配到老年代

JVM中對象的分配過程?

為對象分配內存是一件非常嚴謹和復雜的任務,JVM 的設計者們不僅需要考慮內存如何分配、在哪里分配等問題,并且由于內存分配算法和內存回收算法密切相關,所以還需要考慮 GC 執行完內存回收后是否會在內存空間中產生內存碎片。

  1. new 的對象先放在伊甸園區,此區有大小限制
  2. 當伊甸園的空間填滿時,程序又需要創建對象,JVM 的垃圾回收器將對伊甸園區進行垃圾回收(Minor GC),將伊甸園區中的不再被其他對象所引用的對象進行銷毀。再加載新的對象放到伊甸園區
  3. 然后將伊甸園中的剩余對象移動到幸存者 0 區
  4. 如果再次觸發垃圾回收,此時上次幸存下來的放到幸存者 0 區,如果沒有回收,就會放到幸存者 1 區
  5. 如果再次經歷垃圾回收,此時會重新放回幸存者 0 區,接著再去幸存者 1 區
  6. 什么時候才會去養老區呢?默認是 15 次回收標記
  7. 在養老區,相對悠閑。當養老區內存不足時,再次觸發 Major GC,進行養老區的內存清理
  8. 若養老區執行了 Major GC 之后發現依然無法進行對象的保存,就會產生 OOM 異常

什么是 TLAB (Thread Local Allocation Buffer)?

  • 從內存模型而不是垃圾回收的角度,對 Eden 區域繼續進行劃分,JVM 為每個線程分配了一個私有緩存區域,它包含在 Eden 空間內
  • 多線程同時分配內存時,使用 TLAB 可以避免一系列的非線程安全問題,同時還能提升內存分配的吞吐量,因此我們可以將這種內存分配方式稱為快速分配策略
  • OpenJDK 衍生出來的 JVM 大都提供了 TLAB 設計

為什么要有 TLAB ?

  • 堆區是線程共享的,任何線程都可以訪問到堆區中的共享數據
  • 由于對象實例的創建在 JVM 中非常頻繁,因此在并發環境下從堆區中劃分內存空間是線程不安全的
  • 為避免多個線程操作同一地址,需要使用加鎖等機制,進而影響分配速度

盡管不是所有的對象實例都能夠在 TLAB 中成功分配內存,但 JVM 確實是將 TLAB 作為內存分配的首選。

在程序中,可以通過 -XX:UseTLAB 設置是否開啟 TLAB 空間。

默認情況下,TLAB 空間的內存非常小,僅占有整個 Eden 空間的 1%,我們可以通過 -XX:TLABWasteTargetPercent 設置 TLAB 空間所占用 Eden 空間的百分比大小。

一旦對象在 TLAB 空間分配內存失敗時,JVM 就會嘗試著通過使用加鎖機制確保數據操作的原子性,從而直接在 Eden 空間中分配內存。

責任編輯:武曉燕 來源: 魯大猿
相關推薦

2024-02-21 07:40:17

JVM內存虛擬機

2024-03-11 18:18:58

項目Spring線程池

2024-09-12 08:35:06

2020-03-10 08:01:05

Java堆內存線程共享

2021-04-19 18:56:58

大數字符串運算

2024-11-19 15:13:02

2023-12-27 18:16:39

MVCC隔離級別幻讀

2025-04-08 00:00:00

@AsyncSpring異步

2025-04-16 00:00:01

JWT客戶端存儲加密令

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-05-30 08:04:20

Netty核心組件架構

2021-11-25 10:18:42

RESTfulJava互聯網

2024-02-20 08:13:35

類加載引用Class

2024-03-14 14:56:22

反射Java數據庫連接

2024-07-31 08:28:37

DMAIOMMap

2024-12-06 07:00:00

2024-09-20 08:36:43

零拷貝數據傳輸DMA

2024-03-22 06:56:24

零拷貝技術數據傳輸數據拷貝

2020-07-02 07:52:11

RedisHash映射
點贊
收藏

51CTO技術棧公眾號

亚洲欧美伊人| 激情综合网站| 日本道在线观看一区二区| 精品国产免费av| 亚洲免费网站| 日韩在线不卡视频| 成人黄视频在线观看| 亚洲一区二区三区四区的| 穿情趣内衣被c到高潮视频| 欧美91福利在线观看| 国产精品黄视频| 中文字幕影音在线| 精品国产91乱码一区二区三区| 天堂社区 天堂综合网 天堂资源最新版| av剧情在线观看| 91丨九色丨国产丨porny| 日产精品一线二线三线芒果| 国产精品传媒精东影业在线 | 国产成人久久精品| 久久久伦理片| 日韩精品极品视频免费观看| 成人爽a毛片免费啪啪动漫| 欧美性高清videossexo| 九七久久人人| 欧美精品高清视频| 黄网在线观看| 欧美私人免费视频| 亚洲免费视频一区二区三区| 国产精品色哟哟| 一路向西2在线观看| 国产欧美一区视频| 久久mv成人精品亚洲动漫| 国产精品原创巨作av| 先锋影音资源999| 国产久卡久卡久卡久卡视频精品| 一本一道久久久a久久久精品91 | 一区二区三区高清| av在线播放免费| 在线观看国产成人av片| 国产精品三级| 日本一区二区三区四区在线观看| 美女视频黄 久久| 日本精品久久久久中文字幕| 一区二区高清免费观看影视大全 | 亚洲18色成人| 蜜桃在线一区二区三区精品| 国产人成亚洲第一网站在线播放| 91视频在线观看| 久久精品最新地址| 亚洲都市激情| av免费看网址| 亚洲综合激情小说| 国产h片在线观看| 国产999精品久久久影片官网| 日韩精彩视频在线观看| 成人eeuss影院在线观看| 亚洲精品456在线播放狼人| 综合图区亚洲| 亚洲视频在线免费观看| 亚洲精品tv| 欧美激情精品久久久久久久变态| 视频一区免费在线观看| 亚洲第一成年免费网站| 欧美一区二区三区男人的天堂| 日韩欧美美女在线观看| 91午夜理伦私人影院| 久久女同精品一区二区| 麻豆av免费在线观看| 精品福利一区二区三区| 国产精品一在线观看| 99在线免费观看| 亚洲欧美制服丝袜| 精品久久国产| 欧美乱大交xxxxx潮喷l头像| 亚洲欧美日韩一区二区三区在线| 久久久久综合| av中文字幕电影在线看| 秋霞影院一区二区| 国产最新视频在线观看| 久久久久成人精品免费播放动漫| 亚洲乱码一区二区三区在线观看| 日韩天堂在线| 色婷五月综激情亚洲综合| 久久久久久久久久久免费精品| 中文字幕中文乱码欧美一区二区| 国产精品一区二区99| 番号在线播放| 亚洲成人自拍| 久久久久久久久中文字幕| 亚洲综合视频网| 亚洲美女黄色| 亚洲第一会所001| 能在线观看的av网站| 国产高清在线不卡| 欧美激情一区二区三区| 亚洲欧洲二区| 午夜精品久久久内射近拍高清| 久久久精品视频成人| 亚洲成人久久影院| 国内一区二区视频| 亚洲一区二区三区中文字幕在线观看| 二区视频在线| 3d动漫精品啪啪一区二区三区免费| 日本黄色一区二区| 成人做爰69片免费看网站| 99久久精品费精品国产| 欧美91在线| 六月婷婷在线视频| 色欧美日韩亚洲| 日韩脚交footjobhdboots| 国产精品免费观看高清| 国产在线观看一区二区| 在线观看男女av免费网址| 精品少妇一区二区30p| 国产精品一区二区三区乱码| av毛片在线免费看| 国产欧美精品日韩| 亚洲一区二区av电影| aaa毛片在线观看| 亚洲综合一区二区不卡| 亚洲国产精品人久久电影| 一区二区三区免费| 26uuu欧美日本| 久久电影网站中文字幕| 性xxxx欧美老肥妇牲乱| 日日av拍夜夜添久久免费| 成人精品一区| 欧美tickling挠脚心丨vk| 一区二区三区资源| 日韩不卡免费视频| 噜噜噜久久亚洲精品国产品小说| 亚洲香蕉视频| 精品综合久久88少妇激情| 濑亚美莉一二区在线视频| 久久精品免费一区二区| 免费特级黄色片| 日韩欧美电影一区二区| 亚洲xxx视频| 99九九电视剧免费观看| 成人av免费看| 国产精品中出一区二区三区| 国产99在线|中文| 国产精品igao视频| 国产精品三级在线| 国产精品久久国产精品| 国产在线精品二区| 欧美不卡1区2区3区| 国产有色视频色综合| 91精品久久久久久蜜桃| 欧美日韩亚洲一区二区三区四区| 国产日韩欧美自拍| 欧美不卡在线一区二区三区| 亚洲精品乱码久久久久久蜜桃91 | 亚洲第一二三四五区| 日韩欧美色综合| 亚洲乱码一区二区| 韩国欧美亚洲国产| 国产男女猛烈无遮挡91| 96pao国产成视频永久免费| 亚洲最大的成人网| 久久久久久久香蕉| gogo人体高清视频| 在线看av的网址| 中文在线免费视频| 久久91精品| 国产精品最新自拍| 91麻豆swag| 欧美日韩在线观看一区二区| 日韩www在线| 亚洲va欧美va国产综合久久| wwwjizzjizzcom| jizz蜜桃视频在线观看| 成年在线观看免费人视频| 国产色播av在线| 欧美日韩性在线观看| 久久99国产精品免费| 色综合激情久久| 欧美国产日韩xxxxx| 亚洲三区四区| 超碰在线一区二区三区| 国产精品伦一区二区| 五月久久久综合一区二区小说| 国产一区二区久久| 5858s免费视频成人| 国产在线观看不卡| 国产aaa一级片| 男人天堂亚洲| 亚洲精选91| 欧美日韩中文字幕精品| 国产精品大陆在线观看| 热久久精品免费视频| 日韩欧美精品一区二区三区| 国产欧美日韩综合一区在线播放| 中文字幕在线不卡视频| 久久成人免费视频| 国产黄页在线观看| 日日夜夜天天综合| 91老师片黄在线观看| 日韩在线观看av| 97在线资源在|