最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JDK1.8 JVM運行時數(shù)據(jù)區(qū)域劃分方式

 更新時間:2025年07月10日 08:59:33   作者:bruce128  
JDK1.8 JVM運行時內(nèi)存區(qū)域劃分:元數(shù)據(jù)區(qū)替代永久代,堆空間分年輕代(Eden+Survivor)和老年代,字符串常量池移至堆,直接內(nèi)存通過NIO實現(xiàn)堆外分配,支持通過jcmd工具觀察內(nèi)存占用情況

一、JDK1.8 JVM運行時數(shù)據(jù)區(qū)域概覽

這里介紹的是JDK1.8 JVM運行時內(nèi)存數(shù)據(jù)區(qū)域劃分。1.8同1.7比,最大的差別就是:元數(shù)據(jù)區(qū)取代了永久代。

元空間的本質(zhì)和永久代類似,都是對JVM規(guī)范中方法區(qū)的實現(xiàn)。不過元空間與永久代之間最大的區(qū)別在于:元數(shù)據(jù)空間并不在虛擬機中,而是使用本地內(nèi)存。

二、各區(qū)域介紹

1. 程序計數(shù)器

每個線程一塊,指向當(dāng)前線程正在執(zhí)行的字節(jié)碼代碼的行號。

如果當(dāng)前線程執(zhí)行的是native方法,則其值為null。

2. Java虛擬機棧

線程私有,每個線程對應(yīng)一個Java虛擬機棧,其生命周期與線程同進同退。

每個Java方法在被調(diào)用的時候都會創(chuàng)建一個棧幀,并入棧。一旦完成調(diào)用,則出棧。所有的的棧幀都出棧后,線程也就完成了使命。

3. 本地方法棧

功能與Java虛擬機棧十分相同。

區(qū)別在于,本地方法棧為虛擬機使用到的native方法服務(wù)。不多說。

4. 堆

堆是JVM內(nèi)存占用最大,管理最復(fù)雜的一個區(qū)域。

其唯一的用途就是存放對象實例:幾乎所有的對象實例及數(shù)組都在對上進行分配。

1.7后,字符串常量池從永久代中剝離出來,存放在堆中。

堆有自己進一步的內(nèi)存分塊劃分,按照GC分代收集角度的劃分請參見上圖。

4.1 堆空間內(nèi)存分配(默認情況下)

老年代 : 三分之二的堆空間

年輕代 : 三分之一的堆空間

  • eden區(qū): 8/10 的年輕代空間
  • survivor0 : 1/10 的年輕代空間
  • survivor1 : 1/10 的年輕代空間

命令行上執(zhí)行如下命令,查看所有默認的jvm參數(shù)

java -XX:+PrintFlagsFinal -version

輸出

輸出有大幾百行,這里只取其中的兩個有關(guān)聯(lián)的參數(shù)

[Global flags]
    uintx InitialSurvivorRatio                      = 8                                   {product}
    uintx NewRatio                                  = 2                                   {product}
    ... ...
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

參數(shù)解釋

參數(shù)作用
-XX:InitialSurvivorRatio新生代Eden/Survivor空間的初始比例
-XX:NewratioOld區(qū) 和 Yong區(qū) 的內(nèi)存比例

一道推算題

默認參數(shù)下,如果僅給出eden區(qū)40M,求堆空間總大小

根據(jù)比例可以推算出,兩個survivor區(qū)各5M,年輕代50M。老年代是年輕代的兩倍,即100M。那么堆總大小就是150M。

4.2 字符串常量池

JDK1.7 就開始“去永久代”的工作了。 1.7把字符串常量池從永久代中剝離出來,存放在堆空間中。

a. jvm參數(shù)配置

-XX:MaxPermSize=10m
-XX:PermSize=10m
-Xms100m
-Xmx100m
-XX:-UseGCOverheadLimit

b. 測試代碼

public class StringOomMock {
	
	public static void main(String[] args) {
		try {
			List<String> list = new ArrayList<String>();
			for (int i = 0; ; i++) {
				System.out.println(i);
				list.add(String.valueOf("String" + i++).intern());
			}
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}
	}
}

c. jdk1.6 下的運行結(jié)果

jdk1.6 環(huán)境下是永久代OOM

153658
153660
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
	at java.lang.String.intern(Native Method)
	at com.jd.im.StringOomMock.main(StringOomMock.java:17)

d. jdk1.7 下的運行結(jié)果

jdk1.7 下是堆OOM,并且伴隨著頻繁的FullGC, CPU一直高位運行

2252792
2252794
2252796
2252798
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message can't create name string at ../../../src/share/instrument/JPLISAgent.c line: 807
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.nio.CharBuffer.wrap(CharBuffer.java:369)
	at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:265)
	at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
	at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
	at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
	at java.io.PrintStream.write(PrintStream.java:526)
	at java.io.PrintStream.print(PrintStream.java:597)
	at java.io.PrintStream.println(PrintStream.java:736)
	at com.jd.im.StringOomMock.main(StringOomMock.java:16)

e. jdk1.8 下的運行結(jié)果

jdk1.8的運行結(jié)果同1.7的一樣,都是堆空間OOM。

2236898
2236900
2236902
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.lang.Integer.toString(Integer.java:403)
	at java.lang.String.valueOf(String.java:3099)
	at java.io.PrintStream.print(PrintStream.java:597)
	at java.io.PrintStream.println(PrintStream.java:736)
	at com.jd.im.StringOomMock.main(StringOomMock.java:16)

5. 元數(shù)據(jù)區(qū)

元數(shù)據(jù)區(qū)取代了1.7版本及以前的永久代。元數(shù)據(jù)區(qū)和永久代本質(zhì)上都是方法區(qū)的實現(xiàn)。方法區(qū)存放虛擬機加載的類信息,靜態(tài)變量,常量等數(shù)據(jù)。

元數(shù)據(jù)區(qū)OOM測試:

a. jvm參數(shù)配置

-XX:MetaspaceSize=8m 
-XX:MaxMetaspaceSize=50m

b. 測試代碼

借助cglib框架生成新類。

public class MetaSpaceOomMock {
	
	public static void main(String[] args) {
		ClassLoadingMXBean loadingBean = ManagementFactory.getClassLoadingMXBean();
		while (true) {
			Enhancer enhancer = new Enhancer();
			enhancer.setSuperclass(MetaSpaceOomMock.class);
			enhancer.setCallbackTypes(new Class[]{Dispatcher.class, MethodInterceptor.class});
			enhancer.setCallbackFilter(new CallbackFilter() {
				@Override
				public int accept(Method method) {
					return 1;
				}
				
				@Override
				public boolean equals(Object obj) {
					return super.equals(obj);
				}
			});
			
			Class clazz = enhancer.createClass();
			System.out.println(clazz.getName());
			//顯示數(shù)量信息(共加載過的類型數(shù)目,當(dāng)前還有效的類型數(shù)目,已經(jīng)被卸載的類型數(shù)目)
			System.out.println("total: " + loadingBean.getTotalLoadedClassCount());
			System.out.println("active: " + loadingBean.getLoadedClassCount());
			System.out.println("unloaded: " + loadingBean.getUnloadedClassCount());
		}
	}
}

c. 運行輸出

jvm.MetaSpaceOomMock$$EnhancerByCGLIB$$567f7ec0
total: 6265
active: 6265
unloaded: 0
jvm.MetaSpaceOomMock$$EnhancerByCGLIB$$3501581b
total: 6266
active: 6266
unloaded: 0
Exception in thread "main" net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
	at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:345)
	at net.sf.cglib.proxy.Enhancer.generate(Enhancer.java:492)
	at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
	at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)
	at net.sf.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at net.sf.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)
	at net.sf.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
	at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)
	at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291)
	at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)
	at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:337)
	at jvm.MetaSpaceOomMock.main(MetaSpaceOomMock.java:38)
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:413)
	at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:336)
	... 12 more
Caused by: java.lang.OutOfMemoryError: Metaspace
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	... 17 more

如果是1.7的jdk,那么報OOM的將是PermGen區(qū)域。

6. 直接內(nèi)存

jdk1.4引入了NIO,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存。

三、通過VM.native_memory觀察各個區(qū)的內(nèi)存占用

navtive memory tracking的oracle官方文檔 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html,這里不做贅述

進程啟動參數(shù)增加:

-XX:NativeMemoryTracking=summary

命令行執(zhí)行:jcmd 1 VM.native_memory

[apps@mvx ~]$ jcmd 1 VM.native_memory
1:

Native Memory Tracking:

Total: reserved=4707221KB, committed=2283297KB
-                 Java Heap (reserved=2516992KB, committed=1263104KB)
                            (mmap: reserved=2516992KB, committed=1263104KB) 
 
-                     Class (reserved=1216882KB, committed=186610KB)
                            (classes #26465)
                            (malloc=8562KB #65948) 
                            (mmap: reserved=1208320KB, committed=178048KB) 
 
-                    Thread (reserved=389347KB, committed=389347KB)
                            (thread #378)
                            (stack: reserved=387556KB, committed=387556KB)
                            (malloc=1286KB #1889) 
                            (arena=506KB #752)
 
-                      Code (reserved=268974KB, committed=134102KB)
                            (malloc=19374KB #20793) 
                            (mmap: reserved=249600KB, committed=114728KB) 
 
-                        GC (reserved=95490KB, committed=90598KB)
                            (malloc=3522KB #1944) 
                            (mmap: reserved=91968KB, committed=87076KB) 
 
-                  Compiler (reserved=932KB, committed=932KB)
                            (malloc=801KB #1684) 
                            (arena=131KB #5)
 
-                  Internal (reserved=181632KB, committed=181632KB)
                            (malloc=181600KB #38974) 
                            (mmap: reserved=32KB, committed=32KB) 
 
-                    Symbol (reserved=30300KB, committed=30300KB)
                            (malloc=26424KB #279074) 
                            (arena=3876KB #1)
 
-    Native Memory Tracking (reserved=6482KB, committed=6482KB)
                            (malloc=49KB #550) 
                            (tracking overhead=6434KB)
 
-               Arena Chunk (reserved=188KB, committed=188KB)
                            (malloc=188KB) 

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java+mysql用戶注冊登錄功能

    Java+mysql用戶注冊登錄功能

    這篇文章主要為大家詳細介紹了Java結(jié)合mysql實現(xiàn)用戶注冊登錄功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java中l(wèi)ist根據(jù)id獲取對象的幾種方式

    Java中l(wèi)ist根據(jù)id獲取對象的幾種方式

    這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist根據(jù)id獲取對象的幾種方式,文中通過實例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • MyBatis-Plus 自定義sql語句的實現(xiàn)

    MyBatis-Plus 自定義sql語句的實現(xiàn)

    這篇文章主要介紹了MyBatis-Plus 自定義sql語句的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java正則驗證電話,手機,郵箱,日期,金額的方法示例

    Java正則驗證電話,手機,郵箱,日期,金額的方法示例

    這篇文章主要介紹了Java正則驗證電話,手機,郵箱,日期,金額的方法,結(jié)合具體實例形式分析了Java針對電話,手機,郵箱,日期,金額的正則判定操作技巧,需要的朋友可以參考下
    2017-03-03
  • Java中l(wèi)ombok的@Builder注解的解析與簡單使用詳解

    Java中l(wèi)ombok的@Builder注解的解析與簡單使用詳解

    這篇文章主要介紹了Java中l(wèi)ombok的@Builder注解的解析與簡單使用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Springboot基于enable模塊驅(qū)動的實現(xiàn)

    Springboot基于enable模塊驅(qū)動的實現(xiàn)

    這篇文章主要介紹了Springboot基于enable模塊驅(qū)動的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java解析xml文本的示例方法

    java解析xml文本的示例方法

    這篇文章主要為大家詳細介紹了java解析xml文本的相關(guān)方法,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Mybatis中Mapper映射文件使用詳解

    Mybatis中Mapper映射文件使用詳解

    這篇文章主要介紹了Mybatis中Mapper映射文件使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java超詳細講解類變量和類方法

    Java超詳細講解類變量和類方法

    這篇文章主要介紹了JAVA類變量及類方法代碼實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-05-05
  • 在Java中避免NullPointerException的解決方案

    在Java中避免NullPointerException的解決方案

    這篇文章主要介紹了在Java中避免NullPointerException的解決方案,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論

错那县| 云南省| 清水河县| 兴山县| 鸡东县| 伽师县| 马龙县| 高密市| 福贡县| 大余县| 中超| 滕州市| 若羌县| 安新县| 绥中县| 徐州市| 三亚市| 巴塘县| 达孜县| 东莞市| 灵宝市| 富源县| 武宣县| 宿州市| 泗阳县| 沂南县| 巫山县| 高青县| 忻州市| 钟山县| 平原县| 克什克腾旗| 元氏县| 华亭县| 永新县| 沧州市| 桃源县| 思南县| 凤凰县| 龙江县| 云安县|