JVM調(diào)優(yōu)OutOfMemoryError異常分析_第1頁(yè)
JVM調(diào)優(yōu)OutOfMemoryError異常分析_第2頁(yè)
JVM調(diào)優(yōu)OutOfMemoryError異常分析_第3頁(yè)
JVM調(diào)優(yōu)OutOfMemoryError異常分析_第4頁(yè)
JVM調(diào)優(yōu)OutOfMemoryError異常分析_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第JVM調(diào)優(yōu)OutOfMemoryError異常分析目錄1.Java堆溢出1.1設(shè)置JVM參數(shù)1.2測(cè)試代碼1.3運(yùn)行OOM日志2.Java棧、本地方法棧溢出2.1設(shè)置JVM參數(shù)2.2測(cè)試代碼2.3運(yùn)行OOM日志2.4Java虛擬機(jī)OOM異常3.Java運(yùn)行常量池溢出3.1設(shè)置JVM參數(shù)-注意區(qū)分jdk版本3.2測(cè)試代碼3.3運(yùn)行OOM日志4.Java方法區(qū)溢出-jdk84.1設(shè)置JVM參數(shù)4.2測(cè)試代碼4.3運(yùn)行OOM日志5.本機(jī)直接內(nèi)存溢出5.1設(shè)置JVM參數(shù)5.2測(cè)試代碼5.3運(yùn)行OOM日志

1.Java堆溢出

1.1設(shè)置JVM參數(shù)

-verbose:gc-Xms20M-Xmx20M-Xmn10M-XX:+PrintGC-XX:+PrintGCDetails-XX:+HeapDumpOnOutOfMemoryError-XX:SurvivorRatio=8

-Xmx20m:設(shè)置JVM最大可用內(nèi)存為20M。-Xms20m:設(shè)置JVM促使內(nèi)存為20m。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)-Xmn10m:設(shè)置年輕代大小為10m-XX:SurvivorRatio=8Eden區(qū)和Survivor區(qū)間比例是8:1,所以分配一下就是eden8m,fromspace1m,tospace1m加起來(lái)10m

1.2測(cè)試代碼

packagecom.jzj.jvmtest.oomtest;

importjava.util.ArrayList;

importjava.util.List;

*堆溢出,只要不停的新建對(duì)象,就會(huì)堆溢出

publicclassHeapOOM{

publicstaticvoidmain(String[]args){

System.out.print("最大內(nèi)存:");

System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"MB");

System.out.print("可用內(nèi)存:");

System.out.println(Runtime.getRuntime().freeMemory()/1024/1024+"MB");

System.out.print("已使用內(nèi)存:");

System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"MB");

ListHeapOOMlist=newArrayList();

while(true){

list.add(newHeapOOM());

1.3運(yùn)行OOM日志

可以看到日志java.lang.OutOfMemoryError:JavaheapspaceHeapSpace就是堆溢出

最大內(nèi)存:19MB

可用內(nèi)存:16MB

已使用內(nèi)存:19MB

[GC(AllocationFailure)[PSYoungGen:8192K-1000K(9216K)]8192K-4533K(19456K),0.0044438secs][Times:user=0.00sys=0.00,real=0.01secs]

[GC(AllocationFailure)--[PSYoungGen:9192K-9192K(9216K)]12725K-19427K(19456K),0.0091278secs][Times:user=0.11sys=0.00,real=0.01secs]

[FullGC(Ergonomics)[PSYoungGen:9192K-0K(9216K)][ParOldGen:10235K-10221K(10240K)]19427K-10221K(19456K),[Metaspace:3495K-3495K(1056768K)],0.1549254secs][Times:user=0.69sys=0.02,real=0.16secs]

[FullGC(Ergonomics)[PSYoungGen:8192K-7167K(9216K)][ParOldGen:10221K-8971K(10240K)]18413K-16138K(19456K),[Metaspace:3496K-3496K(1056768K)],0.1722236secs][Times:user=1.30sys=0.00,real=0.17secs]

[FullGC(Ergonomics)[PSYoungGen:7652K-7604K(9216K)][ParOldGen:8971K-8971K(10240K)]16624K-16575K(19456K),[Metaspace:3496K-3496K(1056768K)],0.1296002secs][Times:user=1.25sys=0.00,real=0.13secs]

[FullGC(AllocationFailure)[PSYoungGen:7604K-7604K(9216K)][ParOldGen:8971K-8953K(10240K)]16575K-16557K(19456K),[Metaspace:3496K-3496K(1056768K)],0.1372692secs][Times:user=1.27sys=0.00,real=0.14secs]

java.lang.OutOfMemoryError:Javaheapspace

Dumpingheaptojava_pid28084.hprof...

Heapdumpfilecreated[28363283bytesin0.058secs]

Heap

PSYoungGentotal9216K,used7794K[0x00000000ff600000,0x0000000100000000,0x0000000100000000)

edenspace8192K,95%used[0x00000000ff600000,0x00000000ffd9c8a8,0x00000000ffe00000)

fromspace1024K,0%used[0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)

tospace1024K,0%used[0x00000000fff00000,0x00000000fff00000,0x0000000100000000)

ParOldGentotal10240K,used8953K[0x00000000fec00000,0x00000000ff600000,0x00000000ff600000)

objectspace10240K,87%used[0x00000000fec00000,0x00000000ff4be5a0,0x00000000ff600000)

Metaspaceused3527K,capacity4500K,committed4864K,reserved1056768K

classspaceused385K,capacity388K,committed512K,reserved1048576K

Exceptioninthreadmainjava.lang.OutOfMemoryError:Javaheapspace

atjava.util.Arrays.copyOf(Arrays.java:3210)

atjava.util.Arrays.copyOf(Arrays.java:3181)

atjava.util.ArrayList.grow(ArrayList.java:265)

atjava.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)

atjava.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)

atjava.util.ArrayList.add(ArrayList.java:462)

atcom.jzj.jvmtest.oomtest.HeapOOM.main(HeapOOM.java:20)

Processfinishedwithexitcode1

2.Java棧、本地方法棧溢出

2.1設(shè)置JVM參數(shù)

-verbose:gc-Xms20M-Xmx20M-Xmn10M-XX:+PrintGC-XX:+PrintGCDetails-XX:+HeapDumpOnOutOfMemoryError-XX:SurvivorRatio=8-Xss128k

這次最后加了一個(gè)-Xss設(shè)置每個(gè)線(xiàn)程的堆棧大小

虛擬機(jī)擴(kuò)展棧時(shí),如果棧深度大于虛擬機(jī)允許最大深度,就會(huì)出現(xiàn)StackOverflowError異常如果在擴(kuò)展棧時(shí),需要的內(nèi)存空間不夠,那么就會(huì)出現(xiàn)OutOfMemoryError就是OOM異常

2.2測(cè)試代碼

packagecom.jzj.jvmtest.oomtest;

*棧溢出,只要不停的新建對(duì)象,循環(huán)遞歸,超出棧容量限制就會(huì)OOM

*1.棧深入超出限制,stackOverflowError

*2.棧擴(kuò)展時(shí)候,內(nèi)存不夠,導(dǎo)致OOM異常

publicclassStackOOM{

*初始化棧的深度

privateintstackLength=1;

*循環(huán)去增加棧的深度

publicvoidstackLeak(){

stackLength++;

stackLeak();

publicstaticvoidmain(String[]args){

System.out.print("最大內(nèi)存:");

System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"MB");

System.out.print("可用內(nèi)存:");

System.out.println(Runtime.getRuntime().freeMemory()/1024/1024+"MB");

System.out.print("已使用內(nèi)存:");

System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"MB");

StackOOMoom=newStackOOM();

try{

oom.stackLeak();

}catch(Throwablee){

System.out.println("stacklength============"+oom.stackLength);

throwe;

2.3運(yùn)行OOM日志

可以看到日志Exceptioninthreadmainjava.lang.StackOverflowErrorStackOverflowError就是虛擬機(jī)棧,可以看到棧深度在995的時(shí)候就發(fā)生了異常,超出了虛擬機(jī)棧的深度,拋出異常

最大內(nèi)存:19MB

可用內(nèi)存:16MB

已使用內(nèi)存:19MB

stacklength============995

Heap

PSYoungGentotal9216K,used4158K[0x00000000ff600000,0x0000000100000000,0x0000000100000000)

edenspace8192K,50%used[0x00000000ff600000,0x00000000ffa0fae8,0x00000000ffe00000)

fromspace1024K,0%used[0x00000000fff00000,0x00000000fff00000,0x0000000100000000)

tospace1024K,0%used[0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)

ParOldGentotal10240K,used0K[0x00000000fec00000,0x00000000ff600000,0x00000000ff600000)

objectspace10240K,0%used[0x00000000fec00000,0x00000000fec00000,0x00000000ff600000)

Metaspaceused3558K,capacity4500K,committed4864K,reserved1056768K

classspaceused385K,capacity388K,committed512K,reserved1048576K

Exceptioninthreadmainjava.lang.StackOverflowError

atcom.jzj.jvmtest.oomtest.StackOOM.stackLeak(StackOOM.java:19)

atcom.jzj.jvmtest.oomtest.StackOOM.stackLeak(StackOOM.java:20)

atcom.jzj.jvmtest.oomtest.StackOOM.stackLeak(StackOOM.java:20)

atcom.jzj.jvmtest.oomtest.StackOOM.stackLeak(StackOOM.java:20)

atcom.jzj.jvmtest.oomtest.StackOOM.main(StackOOM.java:34)

Processfinishedwithexitcode1

2.4Java虛擬機(jī)OOM異常

理論上要想虛擬機(jī)棧拋出OOM,在多線(xiàn)程的情況下,可以不停的新建線(xiàn)程來(lái)實(shí)現(xiàn)OOM

但是這樣通過(guò)多個(gè)線(xiàn)程創(chuàng)建的OOM異常和棧空間是否足夠大沒(méi)有直接關(guān)系?準(zhǔn)確來(lái)說(shuō)為每個(gè)線(xiàn)程棧分配的空間越大,反而越容易長(zhǎng)身OOMwhy?為什么為每個(gè)線(xiàn)程分配的空間越大,越容易OOM呢?

分析:

假設(shè)操作系統(tǒng)有2G內(nèi)存虛擬機(jī)可以通過(guò)參數(shù)來(lái)控制虛擬機(jī)堆和方法區(qū)允許內(nèi)存的最大值堆最大值-Xmx控制,方法區(qū)永久區(qū)-MaxPermSize最大方法區(qū)容量控制方法區(qū)大小2GB減去堆大小,減去方法區(qū)大小,剩下的內(nèi)存就由java虛擬機(jī)棧與本地方法棧共享瓜分每個(gè)線(xiàn)程分配的空間越大,那么系統(tǒng)可以操作的線(xiàn)程數(shù)就越少,那么新建線(xiàn)程就越容易超標(biāo),造成OOM

!!!!!!!!為什么在這里我不代碼演示一下創(chuàng)建線(xiàn)程導(dǎo)致oom

因?yàn)镴ava的線(xiàn)程時(shí)映射到操作系統(tǒng)內(nèi)核線(xiàn)程上的,你創(chuàng)建多的線(xiàn)程,執(zhí)行這種代碼,容易造成操作系統(tǒng)假死,電腦死機(jī),所以謹(jǐn)慎操作,這里就不演示這種OOM了

3.Java運(yùn)行常量池溢出

3.1設(shè)置JVM參數(shù)-注意區(qū)分jdk版本

-verbose:gc-Xms20M-Xmx20M-Xmn10M-XX:+PrintGC-XX:+PrintGCDetails-XX:+HeapDumpOnOutOfMemoryError-XX:SurvivorRatio=8-XX:PermSize=5M-XX:MaxPermSize=5M

這里新加了參數(shù)-XX:PermSize=5M-XX:MaxPermSize=5M來(lái)控制方法區(qū)大小

-XX:PermSize=5M:設(shè)置方法區(qū)大小。1.6JDK-XX:MaxPermSize=5M:設(shè)置方法區(qū)最大值。1.6JDK

!!!!!!注意這個(gè)測(cè)試方法用的是String.valueOf(i++).intern()這個(gè)方法在jdk1.6沒(méi)問(wèn)題,是能夠拋出PermSpaceOOM的因?yàn)?/p>

在JDK1.6及之前的版本中,由于常量池分配在永久代內(nèi),我們可以通過(guò)-XX:PermSize和-XX:MaxPermSize限制方法區(qū)大小,從而間接限制其中常量池的容量但是在JDK1.8運(yùn)行這段程序不會(huì)得到相同的結(jié)果,而是出現(xiàn)以下的提示信息,這是因?yàn)檫@兩個(gè)參數(shù)已經(jīng)不在JDK1.7中使用了。提示錯(cuò)誤JavaHotSpot(TM)64-BitServerVMwarning:ignoringoptionPermSize=5M;supportwasremovedin8.0提示錯(cuò)誤JavaHotSpot(TM)64-BitServerVMwarning:ignoringoptionMaxPermSize=5M;supportwasremovedin8.0

不同的版本,這段代碼拋出不同的異常

VMArgs(jdk1.6):-XX:PermSize=10M-XX:MaxPermSize=10M

VMArgs(jdk1.7):-Xms10m-Xmx10m-XX:+HeapDumpOnOutOfMemoryError

VMArgs(jdk1.8):-XX:MetaspaceSize=10m-XX:MaxMetaspaceSize=10m

Exception(jdk1.6):java.lang.OutOfMemoryError:PermGenspace

Exception(jdk1.7):java.lang.OutOfMemoryError:Javaheapspace

Exception(jdk1.8):java.lang.OutOfMemoryError:GCoverheadlimitexceeded

3.2測(cè)試代碼

所以為了在1.8的jdk中,測(cè)試常量池溢出,我們?cè)撊绾文M呢?jdk1.8使用元空間(Metaspace)替代了永久代(PermSize),因此我們可以在1.8中指定Metaspace的大小模擬測(cè)試

!!!!JDK1.8這里新加了參數(shù)來(lái)控制方法區(qū)大小

-XX:MetaspaceSize=5m,初始空間大小,達(dá)到該值就會(huì)觸發(fā)垃圾收集進(jìn)行類(lèi)型卸載,同時(shí)GC會(huì)對(duì)該值進(jìn)行調(diào)整:如果釋放了大量的空間,-XX:MaxMetaspaceSize=5m,最大空間,默認(rèn)是沒(méi)有限制的。

/**

*設(shè)置方法區(qū)及常量池OOM溢出

*方法區(qū)中運(yùn)行時(shí)常量池溢出

*VMArgs(jdk1.6):-XX:PermSize=10M-XX:MaxPermSize=10M

*VMArgs(jdk1.7):-Xms30m-Xmx30m-XX:+HeapDumpOnOutOfMemoryError

*VMArgs(jdk1.8):-XX:MetaspaceSize=10m-XX:MaxMetaspaceSize=10m

*Exception(jdk1.6):java.lang.OutOfMemoryError:PermGenspace

*Exception(jdk1.7):java.lang.OutOfMemoryError:Javaheapspace

*Exception(jdk1.8):java.lang.OutOfMemoryError:GCoverheadlimitexceeded

publicclassConstantOOM{

publicstaticvoidmain(String[]args){

System.out.print("最大內(nèi)存:");

System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"MB");

System.out.print("可用內(nèi)存:");

System.out.println(Runtime.getRuntime().freeMemory()/1024/1024+"MB");

System.out.print("已使用內(nèi)存:");

System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"MB");

//使用List,保持常量池的使用,避免FullGC回收常量池的行為

ListStringstaticList=newArrayList();

//5M的PermSize讓Listfor循環(huán)添加變量讓常量池瘋狂的添加新的對(duì)象

longi=0L;

while(true){

//使用Sern調(diào)用”ab”.intern()方法的時(shí)候會(huì)返回”ab“

//但是這個(gè)方法會(huì)首先檢查字符串池中是否有”ab”這個(gè)字符串,如果存在則返回這個(gè)字符串的引用

//否則就將這個(gè)字符串添加到字符串池中,然會(huì)返回這個(gè)字符串的引用

staticList.add(String.valueOf(i++).intern());

3.3運(yùn)行OOM日志

可以看到日志Exceptioninthreadmainjava.lang.OutOfMemoryError:GCoverheadlimitexceeded并不是MetaSpaceOOM的日志,所以JDK1.8中,上面的代碼是沒(méi)法實(shí)現(xiàn)元空間的內(nèi)存溢出的

最大內(nèi)存:19MB

可用內(nèi)存:16MB

已使用內(nèi)存:19MB

[GC(AllocationFailure)[PSYoungGen:8192K-1016K(9216K)]8192K-5564K(19456K),0.0041671secs][Times:user=0.00sys=0.00,real=0.00secs]

[GC(AllocationFailure)--[PSYoungGen:9208K-9208K(9216K)]13756K-19446K(19456K),0.0086760secs][Times:user=0.01sys=0.00,real=0.01secs]

[FullGC(Ergonomics)[PSYoungGen:9208K-2482K(9216K)][ParOldGen:10237K-10179K(10240K)]19446K-12662K(19456K),[Metaspace:3497K-3497K(1056768K)],0.1127624secs][Times:user=0.41sys=0.00,real=0.11secs]

[FullGC(Ergonomics)[PSYoungGen:8192K-7167K(9216K)][ParOldGen:10179K-10165K(10240K)]18371K-17332K(19456K),[Metaspace:3498K-3498K(1056768K)],0.1072663secs][Times:user=0.63sys=0.00,real=0.11secs]

......

[FullGC(Ergonomics)[PSYoungGen:8192K-8192K(9216K)][ParOldGen:10199K-10199K(10240K)]18391K-18391K(19456K),[Metaspace:3502K-3502K(1056768K)],0.0641831secs][Times:user=0.63sys=0.00,real=0.06secs]

[FullGC(Ergonomics)[PSYoungGen:8192K-8192K(9216K)][ParOldGen:10201K-10201K(10240K)]18393K-18393K(19456K),[Metaspace:3502K-3502K(1056768K)],0.0631814secs][Times:user=0.48sys=0.00,real=0.06secs]

[FullGC(Ergonomics)[PSYoungGen:8192K-8192K(9216K)][ParOldGen:10202K-10202K(10240K)]18394K-18394K(19456K),[Metaspace:3502K-3502K(1056768K)],0.0626523secs][Times:user=0.48sys=0.00,real=0.06secs]

java.lang.OutOfMemoryError:GCoverheadlimitexceeded

Dumpingheaptojava_pid10140.hprof...

Heapdumpfilecreated[24293672bytesin0.065secs]

[FullGC(Ergonomics)[PSYoungGen:8192K-0K(9216K)][ParOldGen:10238K-763K(10240K)]18430K-763K(19456K),[Metaspace:3522K-3522K(1056768K)],0.0068815secs][Times:user=0.16sys=0.00,real=0.01secs]

Heap

PSYoungGentotal9216K,used273K[0x00000000ff600000,0x0000000100000000,0x0000000100000000)

edenspace8192K,3%used[0x00000000ff600000,0x00000000ff6444e0,0x00000000ffe00000)

fromspace1024K,0%used[0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)

tospace1024K,0%used[0x00000000fff00000,0x00000000fff00000,0x0000000100000000)

ParOldGentotal10240K,used763K[0x00000000fec00000,0x00000000ff600000,0x00000000ff600000)

objectspace10240K,7%used[0x00000000fec00000,0x00000000fecbeca8,0x00000000ff600000)

Metaspaceused3616K,capacity4540K,committed4864K,reserved1056768K

classspaceused394K,capacity428K,committed512K,reserved1048576K

Exceptioninthreadmainjava.lang.OutOfMemoryError:GCoverheadlimitexceeded

atjava.lang.Integer.toString(Integer.java:403)

atjava.lang.String.valueOf(String.java:3099)

atcom.jzj.jvmtest.oomtest.PermOOM.main(PermOOM.java:28)

JavaHotSpot(TM)64-BitServerVMwarning:ignoringoptionPermSize=5M;supportwasremovedin8.0

JavaHotSpot(TM)64-BitServerVMwarning:ignoringoptionMaxPermSize=5M;supportwasremovedin8.0

Processfinishedwithexitcode1

4.Java方法區(qū)溢出-jdk8

4.1設(shè)置JVM參數(shù)

所以為了在1.8的jdk中,測(cè)試方法區(qū)溢出,我們?cè)撊绾文M呢?jdk1.8使用元空間(Metaspace)替代了永久代(PermSize),因此我們可以在1.8中指定Metaspace的大小模擬測(cè)試,我們用

!!!!JDK1.8這里新加了參數(shù)來(lái)控制方法區(qū)大小

-XX:MetaspaceSize=5m,初始空間大小,達(dá)到該值就會(huì)觸發(fā)垃圾收集進(jìn)行類(lèi)型卸載,同時(shí)GC會(huì)對(duì)該值進(jìn)行調(diào)整:如果釋放了大量的空間,-XX:MaxMetaspaceSize=5m,最大空間,默認(rèn)是沒(méi)有限制的。

-verbose:gc-Xms20M-Xmx20M-Xmn10M-XX:+PrintGC-XX:+PrintGCDetails-XX:+HeapDumpOnOutOfMemoryError-XX:MetaspaceSize=10m-XX:MaxMetaspaceSize=10m

這里新加了參數(shù)-XX:MetaspaceSize=10M-XX:MaxMetaspaceSize=10M來(lái)控制方法區(qū)大小

-XX:MetaspaceSize=10m,初始空間大小,達(dá)到該值就會(huì)觸發(fā)垃圾收集進(jìn)行類(lèi)型卸載,同時(shí)GC會(huì)對(duì)該值進(jìn)行調(diào)整:如果釋放了大量的空間,-XX:MaxMetaspaceSize=10m,最大空間,默認(rèn)是沒(méi)有限制的。

方法區(qū)存的什么?類(lèi)信息,常量,靜態(tài)變量,我們就用CGLib代理來(lái)創(chuàng)建類(lèi),使得方法區(qū)內(nèi)存溢出

4.2測(cè)試代碼

packagecom.jzj.jvmtest.oomtest;

importxy.Enhancer;

importxy.MethodInterceptor;

*方法區(qū)內(nèi)存溢出,方法區(qū)存放的是類(lèi),靜態(tài)常量,變量信息

*所以我們就用CGLIB瘋狂的創(chuàng)建類(lèi)就可以達(dá)到OOM了

publicclassMethodAreaOOMextendsClassLoader{

publicstaticvoidmain(String[]args){

System.out.print("最大內(nèi)存:");

System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"MB");

System.out.print("可用內(nèi)存:");

System.out.println(Runtime.getRuntime().freeMemory()/1024/1024+"MB");

System.out.print("已使用內(nèi)存:");

System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"MB");

intcount=0;

try{

for(inti=0;i10000;i++){

Enhancerenhancer=newEnhancer();

enhancer.setSuperclass(MethodAreaOOM.class);

enhancer.setUseCache(false);

enhancer.setCallback((MethodInterceptor)(o,method,objects,methodProxy)-methodProxy.invokeSuper(o,args));

//cglib創(chuàng)建類(lèi)文件

enhancer.create();

count=i;

}catch(Throwablee){

System.out.println("****count="+count);

e.printStackTrace();

4.3運(yùn)行OOM日志

可以看到日志java.lang.OutOfMemoryError:Metaspace就是員工間方法區(qū)的OOM溢出

C:\ProgramFiles\Java\jdk1.8.0_181\bin\java.exe-verbose:gc-Xms20M-Xmx20M-Xmn10M-XX:+PrintGC-XX:+PrintGCDetails-XX:+HeapDumpOnOutOfMemoryError-XX:MetaspaceSize=10m-XX:MaxMetaspaceSize=10m-javaagent:E:\ProgramFiles\JetBrains\IntelliJIDEA2025.3.4\lib\idea_rt.jar=59628:E:\ProgramFiles\JetBrains\IntelliJIDEA2025.3.4\bin-Dfile.encoding=UTF-8-classpathC:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\myworkspace\distribute\jvmtest\target\classes;E:\MavenRepository\org\springframework\boot\spring-boot-starter-web\2.5.4\spring-boot-starter-web-2.5.4.jar;E:\MavenRepository\org\springframework\boot\spring-boot-starter\2.5.4\spring-boot-starter-2.5.4.jar;E:\MavenRepository\org\springframework\boot\spring-boot\2.5.4\spring-boot-2.5.4.jar;E:\MavenRepository\org\springframework\boot\spring-boot-autoconfigure\2.5.4\spring-boot-autoconfigure-2.5.4.jar;E:\MavenRepository\org\springframework\boot\spring-boot-starter-logging\2.5.4\spring-boot-starter-logging-2.5.4.jar;E:\MavenRepository\ch\qos\logback\logback-classic\1.2.5\logback-classic-1.2.5.jar;E:\MavenRepository\ch\qos\logback\logback-core\1.2.5\logback-core-1.2.5.jar;E:\MavenRepository\org\apache\logging\log4j\log4j-to-slf4j\2.14.1\log4j-to-slf4j-2.14.1.jar;E:\MavenRepository\org\apache\logging\log4j\log4j-api\2.14.1\log4j-api-2.14.1.jar;E:\MavenRepository\org\slf4j\jul-to-slf4j\1.7.32\jul-to-slf4j-1.7.32.jar;E:\MavenRepository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;E:\MavenRepository\org\yaml\snakeyaml\1.28\snakeyaml-1.28.jar;E:\MavenRepository\org\springframework\boot\spring-boot-starter-json\2.5.4\spring-boot-starter-json-2.5.4.jar;E:\MavenRepository\com\fasterxml\jackson\core\jackson-databind\2.12.4\jackson-databind-2.12.4.jar;E:\MavenRepository\com\fasterxml\jackson\core\jackson-annotations\2.12.4\jackson-annotations-2.12.4.jar;E:\MavenRepository\com\fasterxml\jackson\core\jackson-core\2.12.4\jackson-core-2.12.4.jar;E:\MavenRepository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.12.4\jackson-datatype-jdk8-2.12.4.jar;E:\MavenRepository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.12.4\jackson-datatype-jsr310-2.12.4.jar;E:\MavenRepository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.12.4\jackson-module-parameter-names-2.12.4.jar;E:\MavenRepository\org\springframework\boot\spring-boot-starter-tomcat\2.5.4\spring-boot-starter-tomcat-2.5.4.jar;E:\MavenRepository\org\apache\tomcat\embed\tomcat-embed-core\9.0.52\tomcat-embed-core-9.0.52.jar;E:\MavenRepository\org\apache\tomcat\embed\tomcat-embed-el\9.0.52\tomcat-embed-el-9.0.52.jar;E:\MavenRepository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.52\tomcat-embed-websocket-9.0.52.jar;E:\MavenRepository\org\springframework\spring-web\5.3.9\spring-web-5.3.9.jar;E:\MavenRepository\org\springframework\spring-beans\5.3.9\spring-beans-5.3.9.jar;E:\MavenRepository\org\springframework\spring-webmvc\5.3.9\spring-webmvc-5.3.9.jar;E:\MavenRepository\org\springframework\spring-aop\5.3.9\spring-aop-5.3.9.jar;E:\MavenRepository\org\springframework\spring-context\5.3.9\spring-context-5.3.9.jar;E:\MavenRepository\org\springframework\spring-expression\5.3.9\spring-expression-5.3.9.jar;E:\MavenRepository\org\slf4j\slf4j-api\1.7.32\slf4j-api-1.7.32.jar;E:\MavenRepository\org\springframework\spring-core\5.3.9\spring-core-5.3.9.jar;E:\MavenRepository\org\springframework\spring-jcl\5.3.9\spring-jcl-5.3.9.jarcom.jzj.jvmtest.oomtest.MethodAreaOOM

最大內(nèi)存:19MB

可用內(nèi)存:16MB

已使用內(nèi)存:19MB

[GC(AllocationFailure)[PSYoungGen:8192K-1000K(9216K)]8192K-1709K(19456K),0.0013246secs][Times:user=0.00sys=0.00,real=0.00secs]

[GC(AllocationFailure)[PSYoungGen:9192K-1000K(9216K)]9901K-2255K(19456K),0.0011901secs][Times:user=0.00sys=0.00,real=0.00secs]

...

[FullGC(MetadataGCThreshold)[PSYoungGen:320K-0K(8192K)][ParOldGen:5896K-3747K(10240K)]6216K-3747K(18432K),[Metaspace:10049K-10049K(1058816K)],0.0380225secs][Times:user=0.28sys=0.00,real=0.04secs]

[GC(Lastditchcollection)[PSYoungGen:0K-0K(8192K)]3747K-3747K(18432K),0.0003694secs][Times:user=0.00sys=0.00,real=0.00secs]

[FullGC(Lastditchcollection)[PSYoungGen:0K-0K(8192K)][ParOldGen:3747K-2210K(10240K)]3747K-2210K(18432K),[Metaspace:10049K-10042K(1058816K)],0.0231525secs][Times:user=0.16sys=0.00,real=0.02secs]

java.lang.OutOfMemoryError:Metaspace

Dumpingheaptojava_pid5592.hprof...

Heapdumpfilecreated[4525675bytesin0.014secs]

[GC(MetadataGCThreshold)[PSYoungGen:122K-96K(8192K)]2333K-2306K(18432K),0.0005350secs][Times:user=0.00sys=0.00,real=0.00secs]

[FullGC(MetadataGCThreshold)[PSYoungGen:96K-0K(8192K)][ParOldGen:2210K-2210K(10240K)]2306K-2210K(18432K),[Metaspace:10043K-10043K(1058816K)],0.0095820secs][Times:user=0.02sys=0.00,real=0.01secs]

[GC(Lastditchcollection)[PSYoungGen:0K-0K(8192K)]2210K-2210K(18432K),0.0003715secs][Times:user=0.00sys=0.00,real=0.00secs]

[FullGC(Lastditchcollection)[PSYoungGen:0K-0K(8192K)][ParOldGen:2210K-2210K(10240K)]2210K-2210K(18432K),[Metaspace:10043K-10043K(1058816K)],0.0043271secs][Times:user=0.00sys=0.00,real=0.00secs]

****count=208

Heap

PSYoungGentotal8192K,used246K[0x00000000ff600000,0x0000000100000000,0x0000000100000000)

edenspace6144K,4%used[0x00000000ff600000,0x00000000ff63d878,0x00000000ffc00000)

fromspace2048K,0%used[0x00000000ffc00000,0x00000000ffc00000,0x00000000ffe00000)

tospace2048K,0%used[0x00000000ffe00000,0x00000000ffe00000,0x0000000100000000)

ParOldGentotal10240K,used2210K[0x00000000fec00000,0x00000000ff600000,0x00000000ff600000)

objectspace10240K,21%used[0x00000000fec00000,0x00000000fee28ad8,0x00000000ff600000)

Metaspaceused10074K,capacity10174K,committed10240K,reserved1058816K

classspaceused787K,capacity851K,committed896K,reserved1048576K

java.lang.OutOfMemoryError:Metaspace

atorg.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:557)

atorg.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363)

atxy.Enhancer.generate(Enhancer.java:585)

atorg.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:131)

atorg.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319)

atxy.Enhancer.createHelper(Enhancer.java:572)

atxy.Enhancer.create(Enhancer.java:387)

atcom.jzj.jvmtest.oomtest.MethodAreaOOM.main(MethodAreaOOM.java:28)

Processfinishedwithexitcode0

5.本機(jī)直接內(nèi)存溢出

5.1設(shè)置JVM參數(shù)

-verbose:gc-Xms20M-Xmx20M-Xmn10M-XX:+PrintGC-XX:+PrintGCDetails-XX:+HeapDumpOnOutOfMemoryError-XX:SurvivorRatio=8-XX:MaxDirectMemorySize=5M

這里新加了參數(shù)-XX:MaxDirectMemorySize=5M來(lái)控制本地直接內(nèi)存的大小

-XX:MaxDirectMemorySize=10M:設(shè)置本地直接內(nèi)存大小

5.2測(cè)試代碼

packagecom.jzj.jvmtest.oomtest;

importsun.misc.VM;

importjava.nio.ByteBuffer;

*本地直接內(nèi)存溢出

*參數(shù)-XX:MaxDirectMemorySize=10M來(lái)控制本地直接內(nèi)存的大小

publicclassLocalDirectOOMextendsClassLoader{

privatestaticfinalintONE_MB=1024*1024;

publicstaticvoidmain(String[]args)throwsException{

System.out.print("最大內(nèi)存:");

System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"MB");

System.out.print("可用內(nèi)存:"

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論