亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

二、各區(qū)域介紹

1. 程序計(jì)數(shù)器

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

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

2. Java虛擬機(jī)棧

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

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

3. 本地方法棧

功能與Java虛擬機(jī)棧十分相同。

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

4. 堆

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

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

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

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

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

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

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

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

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

java -XX:+PrintFlagsFinal -version

輸出

輸出有大幾百行,這里只取其中的兩個(gè)有關(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)存比例

一道推算題

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

根據(jù)比例可以推算出,兩個(gè)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. 測(cè)試代碼

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 下的運(yùn)行結(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 下的運(yùn)行結(jié)果

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

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 下的運(yùn)行結(jié)果

jdk1.8的運(yùn)行結(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ū)的實(shí)現(xiàn)。方法區(qū)存放虛擬機(jī)加載的類信息,靜態(tài)變量,常量等數(shù)據(jù)。

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

a. jvm參數(shù)配置

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

b. 測(cè)試代碼

借助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. 運(yùn)行輸出

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,那么報(bào)OOM的將是PermGen區(qū)域。

6. 直接內(nèi)存

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

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

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

進(jìn)程啟動(dòng)參數(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é)

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

相關(guān)文章

  • Java在制作jar包時(shí)引用第三方j(luò)ar包的方法

    Java在制作jar包時(shí)引用第三方j(luò)ar包的方法

    這篇文章主要介紹了Java在制作jar包時(shí)引用第三方j(luò)ar包的方法的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • 詳解Java的Spring框架中的事務(wù)管理方式

    詳解Java的Spring框架中的事務(wù)管理方式

    這篇文章主要介紹了Java的Spring框架中的事務(wù)管理方式,Spring框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)

    Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)

    相信大家都知道Java解析xml的方法有四種,每種方法都很不錯(cuò),今天通過本文給大家分享使用DOM4j進(jìn)行解析的方法,文章通過兩種方法給大家進(jìn)行解析,感興趣的朋友一起看看吧
    2021-08-08
  • 開源的Java圖片處理庫實(shí)例詳解

    開源的Java圖片處理庫實(shí)例詳解

    Java?圖片處理庫提供了豐富的功能,用于處理和增強(qiáng)圖像,在Java生態(tài)系統(tǒng)中,有幾個(gè)流行的開源庫可以用于圖片處理,這些庫提供了豐富的功能,如圖像縮放、裁剪、顏色調(diào)整、格式轉(zhuǎn)換等,本文介紹開源的Java圖片處理庫介紹,感興趣的朋友一起看看吧
    2024-03-03
  • Java實(shí)現(xiàn)導(dǎo)入csv的示例代碼

    Java實(shí)現(xiàn)導(dǎo)入csv的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)導(dǎo)入csv的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式

    Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式

    這篇文章主要介紹了Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 詳解spring cloud整合Swagger2構(gòu)建RESTful服務(wù)的APIs

    詳解spring cloud整合Swagger2構(gòu)建RESTful服務(wù)的APIs

    這篇文章主要介紹了詳解spring cloud整合Swagger2構(gòu)建RESTful服務(wù)的APIs,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • SpringCloud?Gateway詳細(xì)分析實(shí)現(xiàn)負(fù)載均衡與熔斷和限流

    SpringCloud?Gateway詳細(xì)分析實(shí)現(xiàn)負(fù)載均衡與熔斷和限流

    這篇文章主要介紹了SpringCloud?Gateway實(shí)現(xiàn)路由轉(zhuǎn)發(fā),負(fù)載均衡,熔斷和限流,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Mybatis?一級(jí)緩存和二級(jí)緩存原理區(qū)別

    Mybatis?一級(jí)緩存和二級(jí)緩存原理區(qū)別

    這篇文章主要介紹了Mybatis?一級(jí)緩存和二級(jí)緩存原理區(qū)別?,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 使用IDEA如何拉取GitLab項(xiàng)目

    使用IDEA如何拉取GitLab項(xiàng)目

    使用IDEA拉取GitLab項(xiàng)目,首先需要組長(zhǎng)提供的socket和賬號(hào)密碼登錄內(nèi)網(wǎng)的GitLab,打開IDEA,選擇新建項(xiàng)目,選擇Project from Version Control,然后在項(xiàng)目路徑后面添加.git,以上步驟為個(gè)人操作經(jīng)驗(yàn),希望能為大家提供參考
    2024-10-10

最新評(píng)論