JVM內(nèi)存逃逸是指在程序執(zhí)行過程中,對(duì)象的引用超出了其作用范圍,導(dǎo)致該對(duì)象無(wú)法被垃圾回收器回收,從而占用了內(nèi)存空間。以下是一些常見的JVM內(nèi)存逃逸的原因:
對(duì)象被返回:當(dāng)一個(gè)方法返回一個(gè)對(duì)象時(shí),如果該對(duì)象的引用被其他方法或者變量持有,那么該對(duì)象就會(huì)逃逸。
對(duì)象被賦值給成員變量:當(dāng)一個(gè)對(duì)象被賦值給某個(gè)類的成員變量時(shí),如果該類的實(shí)例被其他對(duì)象引用,那么該對(duì)象就會(huì)逃逸。
對(duì)象被賦值給全局變量:當(dāng)一個(gè)對(duì)象被賦值給全局變量或者靜態(tài)變量時(shí),該對(duì)象就會(huì)逃逸。
對(duì)象被放入容器中:當(dāng)一個(gè)對(duì)象被放入某個(gè)容器(如List、Map等)中,而該容器被其他方法引用,那么該對(duì)象就會(huì)逃逸。
對(duì)象作為參數(shù)傳遞給其他方法:當(dāng)一個(gè)對(duì)象作為參數(shù)傳遞給其他方法時(shí),如果該對(duì)象的引用被其他方法或者變量持有,那么該對(duì)象就會(huì)逃逸。
對(duì)象作為線程共享變量:當(dāng)一個(gè)對(duì)象被多個(gè)線程共享,并且在多個(gè)線程中使用,那么該對(duì)象就會(huì)逃逸。
對(duì)象被發(fā)布到外部:當(dāng)一個(gè)對(duì)象被發(fā)布到外部(如存儲(chǔ)在共享內(nèi)存中、序列化到文件中等),那么該對(duì)象就會(huì)逃逸。
以上是一些常見的JVM內(nèi)存逃逸的原因,當(dāng)對(duì)象發(fā)生逃逸時(shí),會(huì)導(dǎo)致垃圾回收器無(wú)法回收該對(duì)象,從而增加了內(nèi)存壓力。因此,在編寫程序時(shí),需要注意對(duì)象的生命周期和作用域,避免不必要的內(nèi)存逃逸。