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

專(zhuān)注Java教育14年 全國(guó)咨詢(xún)/投訴熱線(xiàn):400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) 深入理解Java內(nèi)存模型

深入理解Java內(nèi)存模型

更新時(shí)間:2022-11-17 12:21:44 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1474次

了解 Java 內(nèi)存模型是開(kāi)發(fā)、部署、監(jiān)視、測(cè)試和調(diào)優(yōu) Java 應(yīng)用程序性能的嚴(yán)肅 Java 開(kāi)發(fā)人員的基本學(xué)習(xí)內(nèi)容。在這篇博文中,我們將討論 Java 內(nèi)存模型以及 JVM 內(nèi)存模型的每個(gè)部分如何有助于運(yùn)行我們的程序。

首先看看你是否看懂下面這張JVM架構(gòu)圖。

JVM內(nèi)存模型

在運(yùn)行資源密集型 Java 程序時(shí),您必須使用以下一些 JVM 內(nèi)存配置。

-XmsSetting — 初始堆大小

-XmxSetting — 最大堆大小

-XX:NewSizeSetting — 新一代堆大小

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

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

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

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

但是你有沒(méi)有想過(guò)你的 JVM 是如何駐留在內(nèi)存中的?讓我展示一下。就像任何其他軟件一樣,JVM 會(huì)消耗主機(jī)操作系統(tǒng)內(nèi)存上的可用空間。

然而,在 JVM 內(nèi)部,存在單獨(dú)的內(nèi)存空間(Heap、Non-Heap、Cache),用于存儲(chǔ)運(yùn)行時(shí)數(shù)據(jù)和編譯后的代碼。

1.堆內(nèi)存

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

堆在 JVM 啟動(dòng)時(shí)分配(初始大小:-Xms)

堆大小在應(yīng)用程序運(yùn)行時(shí)增加/減少

最大尺寸:-Xmx

(1)年輕一代

這是為包含新分配的對(duì)象而保留的

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

大多數(shù)新創(chuàng)建的對(duì)象進(jìn)入伊甸園空間。

當(dāng) Eden 空間充滿(mǎn)對(duì)象時(shí),將執(zhí)行Minor GC(又名Young Collection),并將所有幸存者對(duì)象移動(dòng)到其中一個(gè)幸存者空間。

Minor GC 還會(huì)檢查幸存者對(duì)象并將它們移動(dòng)到其他幸存者空間。所以在某個(gè)時(shí)候,其中一個(gè)幸存者空間總是空的。

經(jīng)過(guò)多次 GC 循環(huán)后幸存下來(lái)的對(duì)象將被移至老年代內(nèi)存空間。通常這是通過(guò)在年輕代對(duì)象有資格提升到老年代之前設(shè)置年齡閾值來(lái)完成的。

(2)老一代

這是保留的,用于包含在多輪 Minor GC 后可以存活的長(zhǎng)壽命對(duì)象

當(dāng) Old Gen 空間已滿(mǎn)時(shí),執(zhí)行Major GC(又名Old Collection)(通常需要更長(zhǎng)的時(shí)間)

2.非堆內(nèi)存

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

Perm Gen 存儲(chǔ)每個(gè)類(lèi)的結(jié)構(gòu),例如運(yùn)行時(shí)常量池、字段和方法數(shù)據(jù)、方法和構(gòu)造函數(shù)的代碼,以及 interned 字符串

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

3.高速緩存

這包括代碼緩存

存放JIT編譯器生成的編譯代碼(即native代碼)、JVM內(nèi)部結(jié)構(gòu)、加載的profiler agent代碼和數(shù)據(jù)等。

當(dāng)代碼緩存超過(guò)閾值時(shí),它會(huì)被刷新(對(duì)象不會(huì)被 GC 重新定位)。

堆棧與堆

到目前為止,我沒(méi)有提到任何關(guān)于 Java Stack 內(nèi)存的內(nèi)容,因?yàn)槲蚁雴为?dú)強(qiáng)調(diào)它的區(qū)別。首先,看看下面的圖片,看看你是否知道這里發(fā)生了什么。

總之,長(zhǎng)話(huà)短說(shuō),Java Stack 內(nèi)存用于線(xiàn)程的執(zhí)行,它包含方法特定的值和對(duì) Heap 中其他對(duì)象的引用。讓我們將 Stack 和 Heap 都放到一個(gè)表中,看看它們的區(qū)別。

這是一個(gè)很好的例子(來(lái)自 baeldung.com),它說(shuō)明了 Stack 和 Heap 如何有助于執(zhí)行一個(gè)簡(jiǎn)單的程序(使用代碼檢查堆棧順序)。

類(lèi)人 { 
    int pid; 
    字符串名稱(chēng);
// 構(gòu)造函數(shù),setter/getter 
}
public class Driver { 
    public static void main(String[] args) { 
        int id = 23; 
        String pName = "喬恩"; 
        人 p = null;
        p = new Person(id, pName); 
    } 
}

修改

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

Keep Area——新生代中的一個(gè)新內(nèi)存空間,用于包含最近分配的對(duì)象。直到下一個(gè)年輕一代才會(huì)執(zhí)行 GC。這個(gè)區(qū)域防止對(duì)象僅僅因?yàn)樗鼈兪窃谀贻p收集開(kāi)始之前分配的而被提升。

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

注意: 始終建議您瀏覽供應(yīng)商文檔以找出適合您的 JVM 版本的內(nèi)容。

內(nèi)存相關(guān)問(wèn)題

當(dāng)存在嚴(yán)重的內(nèi)存問(wèn)題時(shí),JVM 會(huì)崩潰并在您的程序輸出中拋出錯(cuò)誤指示,如下所示。

java.lang.StackOverFlowError — 表示Java堆棧內(nèi)存已滿(mǎn)

java.lang.OutOfMemoryError: Java heap space — 表示堆內(nèi)存已滿(mǎn)

java.lang.OutOfMemoryError: GC Overhead limit exceeded — 表示 GC 已達(dá)到其開(kāi)銷(xiāo)限制

java.lang.OutOfMemoryError: Permgen space — 表示永久代空間已滿(mǎn)

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

java.lang.OutOfMemoryError: Unable to create new native thread — 表示 JVM 本機(jī)代碼無(wú)法再?gòu)牡讓硬僮飨到y(tǒng)創(chuàng)建新的本機(jī)線(xiàn)程,因?yàn)橐呀?jīng)創(chuàng)建了太多線(xiàn)程并且它們消耗了 JVM 的所有可用內(nèi)存

java.lang.OutOfMemoryError: request size bytes for reason — 表示交換內(nèi)存空間已被應(yīng)用程序完全消耗

java.lang.OutOfMemoryError: Requested array size exceeds VM limit – 表示我們的應(yīng)用程序使用的數(shù)組大小超過(guò)了底層平臺(tái)允許的大小

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 天天干天天色天天射 | 日本三级做a全过程在线观看 | 亚洲九月天 | 亚洲精品久久久久久久久久久网站 | 2020年国产高中毛片在线视频 | 一区二区美女视频 | 国产香蕉偷在线观看视频 | 九九视频高清视频免费观看 | 中文字幕在线播放一区 | 欧美视频日韩专区午夜 | 国产美女久久 | 成 人 a v免费视频 | 成人在线视频一区 | 国产一级久久久久久毛片 | 欧美日韩国产成人综合在线 | 在线观看欧美视频 | 久久精彩免费视频 | 国产dvd毛片在线视频 | www.夜夜骑.com| 免费日b视频 | 久久国产精品成人免费 | 亚洲第一区第二区 | 深夜影院在线观看 | 亚洲精品9999久久久久 | 在线中文字幕日韩 | 久久性视频| 亚洲精品国产精品乱码不卞 | 毛片18| 亚洲欧美精品一区 | 福利入口在线观看 | 久久精品久噜噜噜久久 | 毛片爱爱 | 日韩国产一区二区 | 中文字幕在线精品视频入口一区 | 天天伊人| 国产成人aa视频在线观看 | 成年女人午夜毛片免费看 | 97伦理片| 久久嫩模 | 一区二区色 | 伊人免费在线观看 |