Java 堆內(nèi)存分區(qū)的實(shí)現(xiàn)示例
Java 堆內(nèi)存(Heap Memory)是 Java 虛擬機(jī)(JVM)中用于存儲(chǔ)對(duì)象實(shí)例的區(qū)域。為了更有效地管理和回收內(nèi)存,Java 堆通常被劃分為不同的區(qū)域,每個(gè)區(qū)域有特定的用途和特點(diǎn)。以下是 Java 堆內(nèi)存分區(qū)的定義、作用以及相關(guān)的示例。
Java 堆內(nèi)存分區(qū)
Java 堆通常被分為三大區(qū)域:
- 年輕代(Young Generation)
- 老年代(Old Generation)
- 永久代(Permanent Generation) / 元空間(Metaspace)
1. 年輕代(Young Generation)
定義:年輕代用于存儲(chǔ)新創(chuàng)建的對(duì)象。這一代又進(jìn)一步劃分為三個(gè)區(qū)域:Eden 區(qū)、Survivor From 區(qū)和 Survivor To 區(qū)。
作用:
- Eden 區(qū):大多數(shù)新創(chuàng)建的對(duì)象首先在 Eden 區(qū)分配內(nèi)存。
- Survivor From 區(qū)和 Survivor To 區(qū):用于存活對(duì)象的復(fù)制。在垃圾回收過(guò)程中,存活的對(duì)象從一個(gè) Survivor 區(qū)復(fù)制到另一個(gè) Survivor 區(qū)或移動(dòng)到老年代。
垃圾回收:年輕代采用的是 Minor GC(小型垃圾回收)。由于大多數(shù)對(duì)象在創(chuàng)建后很快就變得不可達(dá),Minor GC 可以快速回收這些對(duì)象。
示例:
public class YoungGenerationExample {
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
// 創(chuàng)建短生命周期的對(duì)象,分配在 Eden 區(qū)
byte[] array = new byte[1024 * 1024];
}
}
}
在這個(gè)示例中,大量短生命周期的對(duì)象被創(chuàng)建并分配在 Eden 區(qū)。
2. 老年代(Old Generation)
定義:老年代用于存儲(chǔ)生命周期較長(zhǎng)的對(duì)象。經(jīng)過(guò)多次 Minor GC 仍然存活的對(duì)象會(huì)被移到老年代。
作用:老年代用于存儲(chǔ)生命周期較長(zhǎng)的對(duì)象,這些對(duì)象不容易被回收。
垃圾回收:老年代采用的是 Major GC(也稱為 Full GC)。由于老年代的對(duì)象存活率較高,Major GC 的頻率較低但耗時(shí)較長(zhǎng)。
示例:
public class OldGenerationExample {
public static void main(String[] args) {
// 創(chuàng)建生命周期較長(zhǎng)的對(duì)象
byte[] array = new byte[10 * 1024 * 1024];
// 讓對(duì)象存活,防止被回收
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
在這個(gè)示例中,創(chuàng)建了一個(gè)生命周期較長(zhǎng)的大對(duì)象,最終會(huì)被移動(dòng)到老年代。
3. 永久代(Permanent Generation)和元空間(Metaspace)
定義:永久代和元空間用于存儲(chǔ)類元數(shù)據(jù)(class metadata)、常量池、靜態(tài)變量和 JIT 編譯后的代碼。
- 永久代(Permanent Generation):用于存儲(chǔ)類元數(shù)據(jù)和其他與類有關(guān)的結(jié)構(gòu)。在 Java 8 之前,永久代是方法區(qū)的實(shí)現(xiàn)。
- 元空間(Metaspace):從 Java 8 開(kāi)始,永久代被元空間取代。元空間使用本地內(nèi)存(native memory)而不是堆內(nèi)存。
作用:
- 永久代:存儲(chǔ)類信息、常量、靜態(tài)變量和方法數(shù)據(jù)。
- 元空間:更靈活地管理類元數(shù)據(jù),避免了永久代的固定大小限制。
示例:
public class MetaspaceExample {
public static void main(String[] args) {
// 創(chuàng)建大量類加載操作,增加元空間的使用
for (int i = 0; i < 10000; i++) {
ClassLoader loader = new DynamicClassLoader();
try {
Class<?> clazz = loader.loadClass("example.MyClass" + i);
Object instance = clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class DynamicClassLoader extends ClassLoader {
@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// 動(dòng)態(tài)生成字節(jié)碼
return new byte[0];
}
}
在這個(gè)示例中,通過(guò)動(dòng)態(tài)類加載器創(chuàng)建大量類,增加元空間的使用。
總結(jié)
- 年輕代:存儲(chǔ)新創(chuàng)建的對(duì)象,包含 Eden 區(qū)和兩個(gè) Survivor 區(qū),進(jìn)行 Minor GC。
- 老年代:存儲(chǔ)生命周期較長(zhǎng)的對(duì)象,進(jìn)行 Major GC。
- 永久代 / 元空間:存儲(chǔ)類元數(shù)據(jù),Java 8 之后使用元空間,避免了永久代的固定大小限制。
理解 Java 堆內(nèi)存分區(qū)有助于優(yōu)化應(yīng)用程序性能和有效管理內(nèi)存資源。
到此這篇關(guān)于Java 堆內(nèi)存分區(qū)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Java 堆內(nèi)存分區(qū)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于@Scheduled注解的任務(wù)為什么不執(zhí)行的問(wèn)題
這篇文章主要介紹了關(guān)于@Scheduled注解的任務(wù)為什么不執(zhí)行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
JAVA 多態(tài)操作----父類與子類轉(zhuǎn)換問(wèn)題實(shí)例分析
這篇文章主要介紹了JAVA 多態(tài)操作----父類與子類轉(zhuǎn)換問(wèn)題,結(jié)合實(shí)例形式分析了JAVA 多態(tài)操作中父類與子類轉(zhuǎn)換問(wèn)題相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-05-05
IDEA啟動(dòng)Tomcat報(bào)Unrecognized option: --add-opens=java
這篇文章主要為大家介紹了解決IDEA啟動(dòng)Tomcat報(bào)Unrecognized option: --add-opens=java.base/java.lang=ALL-UNNAMED的方法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
Spring?Boot?集成JWT實(shí)現(xiàn)前后端認(rèn)證的示例代碼
小程序、H5應(yīng)用的快速發(fā)展,使得前后端分離已經(jīng)成為了趨勢(shì),本文主要介紹了Spring?Boot?集成JWT實(shí)現(xiàn)前后端認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
java中stringbuffer線程安全分析實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于java中stringbuffer線程安全分析實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01
Java struts2 validate用戶登錄校驗(yàn)功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java struts2 validate用戶登錄校驗(yàn)功能實(shí)現(xiàn)的具體步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
Java如何利用CompletableFuture描述任務(wù)之間的關(guān)系
Java如何根據(jù)線程的執(zhí)行結(jié)果執(zhí)行下一步動(dòng)作呢,F(xiàn)uture的另一個(gè)實(shí)現(xiàn)類CompletableFuture能夠優(yōu)雅的解決異步化問(wèn)題,下面就跟隨小編一起了解一下吧2023-07-07

