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

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 深入理解Java內存模型

深入理解Java內存模型

更新時間:2022-11-17 12:21:44 來源:動力節點 瀏覽1342次

了解 Java 內存模型是開發、部署、監視、測試和調優 Java 應用程序性能的嚴肅 Java 開發人員的基本學習內容。在這篇博文中,我們將討論 Java 內存模型以及 JVM 內存模型的每個部分如何有助于運行我們的程序。

首先看看你是否看懂下面這張JVM架構圖。

JVM內存模型

在運行資源密集型 Java 程序時,您必須使用以下一些 JVM 內存配置。

-XmsSetting — 初始堆大小

-XmxSetting — 最大堆大小

-XX:NewSizeSetting — 新一代堆大小

-XX:MaxNewSizeSetting — 最大新生代堆大小

-XX:MaxPermGenSetting — 永久代的最大大小

-XX:SurvivorRatioSetting — 新的堆大小比率(例如,如果 Young Gen 大小為 10m 且內存開關為 –XX:SurvivorRatio=2,則將為 Eden 空間保留 5m,為兩個 Survivor 空間各保留 2.5m,默認值 = 8)

-XX:NewRatio — 提供 Old/New Gen 大小的比率(默認值 = 2)

但是你有沒有想過你的 JVM 是如何駐留在內存中的?讓我展示一下。就像任何其他軟件一樣,JVM 會消耗主機操作系統內存上的可用空間。

然而,在 JVM 內部,存在單獨的內存空間(Heap、Non-Heap、Cache),用于存儲運行時數據和編譯后的代碼。

1.堆內存

堆分為兩部分——年輕一代和老一輩

堆在 JVM 啟動時分配(初始大小:-Xms)

堆大小在應用程序運行時增加/減少

最大尺寸:-Xmx

(1)年輕一代

這是為包含新分配的對象而保留的

Young Gen包括三個部分——Eden Memory和兩個Survivor Memory空間(S0,S1)

大多數新創建的對象進入伊甸園空間。

當 Eden 空間充滿對象時,將執行Minor GC(又名Young Collection),并將所有幸存者對象移動到其中一個幸存者空間。

Minor GC 還會檢查幸存者對象并將它們移動到其他幸存者空間。所以在某個時候,其中一個幸存者空間總是空的。

經過多次 GC 循環后幸存下來的對象將被移至老年代內存空間。通常這是通過在年輕代對象有資格提升到老年代之前設置年齡閾值來完成的。

(2)老一代

這是保留的,用于包含在多輪 Minor GC 后可以存活的長壽命對象

當 Old Gen 空間已滿時,執行Major GC(又名Old Collection)(通常需要更長的時間)

2.非堆內存

這包括永久生成(自 Java 8 起由元空間取代)

Perm Gen 存儲每個類的結構,例如運行時常量池、字段和方法數據、方法和構造函數的代碼,以及 interned 字符串

Its size can be changed using -XX:PermSize and -XX:MaxPermSize

3.高速緩存

這包括代碼緩存

存放JIT編譯器生成的編譯代碼(即native代碼)、JVM內部結構、加載的profiler agent代碼和數據等。

當代碼緩存超過閾值時,它會被刷新(對象不會被 GC 重新定位)。

堆棧與堆

到目前為止,我沒有提到任何關于 Java Stack 內存的內容,因為我想單獨強調它的區別。首先,看看下面的圖片,看看你是否知道這里發生了什么。

總之,長話短說,Java Stack 內存用于線程的執行,它包含方法特定的值和對 Heap 中其他對象的引用。讓我們將 Stack 和 Heap 都放到一個表中,看看它們的區別。

這是一個很好的例子(來自 baeldung.com),它說明了 Stack 和 Heap 如何有助于執行一個簡單的程序(使用代碼檢查堆棧順序)。

類人 { 
    int pid; 
    字符串名稱;
// 構造函數,setter/getter 
}
public class Driver { 
    public static void main(String[] args) { 
        int id = 23; 
        String pName = "喬恩"; 
        人 p = null;
        p = new Person(id, pName); 
    } 
}

修改

上面的 Java 內存模型是最常討論的實現。然而,最新的 JVM 版本有不同的修改,例如引入了以下新的內存空間。

Keep Area——新生代中的一個新內存空間,用于包含最近分配的對象。直到下一個年輕一代才會執行 GC。這個區域防止對象僅僅因為它們是在年輕收集開始之前分配的而被提升。

Metaspace——從 Java 8 開始,Permanent Generation 被 Metaspace 取代。它可以自動增加它的大小(直到底層操作系統提供的大小),即使 Perm Gen 總是有一個固定的最大大小。只要類加載器處于活動狀態,元數據就會在元空間中保持活動狀態并且不能被釋放。

注意: 始終建議您瀏覽供應商文檔以找出適合您的 JVM 版本的內容。

內存相關問題

當存在嚴重的內存問題時,JVM 會崩潰并在您的程序輸出中拋出錯誤指示,如下所示。

java.lang.StackOverFlowError — 表示Java堆棧內存已滿

java.lang.OutOfMemoryError: Java heap space — 表示堆內存已滿

java.lang.OutOfMemoryError: GC Overhead limit exceeded — 表示 GC 已達到其開銷限制

java.lang.OutOfMemoryError: Permgen space — 表示永久代空間已滿

java.lang.OutOfMemoryError: Metaspace — 表示元空間已滿(自 Java 8 起)

java.lang.OutOfMemoryError: Unable to create new native thread — 表示 JVM 本機代碼無法再從底層操作系統創建新的本機線程,因為已經創建了太多線程并且它們消耗了 JVM 的所有可用內存

java.lang.OutOfMemoryError: request size bytes for reason — 表示交換內存空間已被應用程序完全消耗

java.lang.OutOfMemoryError: Requested array size exceeds VM limit – 表示我們的應用程序使用的數組大小超過了底層平臺允許的大小

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 色播99 | 色婷婷久久免费网站 | 99久久综合 | 欧美大片天天免费看视频 | 中文字幕久热精品视频免费 | 伊伊综合| 欧美性网| 99久久99这里只有免费的精品 | 国内视频自拍在线视频 | 日本草草影院 | 亚洲精品不卡午夜精品 | 久久精品国产久精国产 | 一级毛片美国一级j毛片不卡 | 男人资源在线观看 | 久草久| 亚洲天天做夜夜做天天欢人人 | 亚洲欧美日韩国产精品 | 久草视频福利在线观看 | 成人亚欧网站在线观看 | 欧美成人性毛片免费版 | 免费视频网站一级人爱视频 | 天天干天天射天天爽 | 国产成人禁片免费观看 | 精品夜夜春夜夜爽久久 | 精品久久久久久久 | 成人性生活免费视频 | 日本精品网站 | 国产自愉自愉全免费高清 | 国产高清精品一级毛片 | 999在线视频| 欧美丰满大乳大屁股毛片 | 亚洲一二三 | 婷婷国产成人久久精品激情 | 91福利视频免费观看 | 久久精品免视看国产陈冠希 | 久久久久久a亚洲欧洲aⅴ | 成人性生活免费看 | 91欧美亚洲| 久久天天躁狠狠躁夜夜躁 | 最近在线更新中文字幕1 | 奇米影视777me |