? ? ?在這個(gè)云計(jì)算時(shí)代,云服務(wù)提供商使用不同的定價(jià)模式。?基于消耗的定價(jià)模型會(huì)對(duì)資源使用情況收取費(fèi)用,這通常包括內(nèi)存量,CPU周期,磁盤(pán)空間,網(wǎng)絡(luò)流量等。 如果能在程序運(yùn)行的空閑時(shí),能降低資源的消耗,就能降低成本的支出。
? ? ?而JVM在運(yùn)行時(shí),會(huì)自己申請(qǐng)一塊內(nèi)存區(qū)域,這塊區(qū)域被稱作是堆,由JVM自身來(lái)管理,當(dāng)應(yīng)用程序運(yùn)行一段時(shí)間后,Java堆將被垃圾對(duì)象所填充, 然后被回收,而當(dāng)應(yīng)用程序變?yōu)榭臻e狀態(tài)時(shí),由于沒(méi)有空間請(qǐng)求,JVM不會(huì)費(fèi)心收集垃圾。?所以,應(yīng)用程序最終會(huì)產(chǎn)生一個(gè)龐大的堆,即使在閑置期間也會(huì)保持內(nèi)存占用率過(guò)高,導(dǎo)致不必要的成本支出。
? ? ?為了解決這樣的問(wèn)題,在openJ9中有一個(gè)-XX:+ IdleTuningGcOnIdle選項(xiàng)來(lái)啟用空閑調(diào)整功能,其內(nèi)部計(jì)數(shù)器來(lái)判斷應(yīng)用程序是否進(jìn)入空閑周期時(shí),當(dāng)識(shí)別為進(jìn)入了空閑周期,就會(huì)將占用的內(nèi)存釋放會(huì)操作系統(tǒng)。

? 從上圖中可以看到 ,Java堆的內(nèi)存量在空閑期間不會(huì)下降,這不是錯(cuò)誤,因?yàn)镺penJ9不會(huì)調(diào)整堆大小,它只會(huì)解除堆頁(yè)并將內(nèi)存返回給操作系統(tǒng)。?因此,JVM報(bào)告的堆用量不會(huì)改變,改變的只是進(jìn)程的內(nèi)存占用
使用這個(gè)參數(shù)時(shí),需要注意一下幾點(diǎn):
1) -XX:+ IdleTuningGcOnIdle只能在Linux x86-64位平臺(tái)上使用
2)只用配合gencon?GC策略使用,這是默認(rèn)的GC策略。
3)應(yīng)用程序必須閑置一段時(shí)候后,才能觸發(fā)進(jìn)程內(nèi)存的回收,這個(gè)時(shí)間可以通過(guò)-XX:IdleTuningMinIdleWaitTime來(lái)調(diào)整