參數(shù)解釋
-Xmx 指定最大堆 java虛擬機(jī)最多能夠使用多少堆空間
-Xms 指定最小堆 至少使用多少空間,只要java虛擬機(jī)啟動 ,這么多空間就會被占用
怎么設(shè)置
常見的機(jī)器配置是2核4G,或者是4核8G
如果我們用2核4G的機(jī)器來部署,那么還是有點緊湊的,因為機(jī)器有4G內(nèi)存,但是機(jī)器本身也要用一些內(nèi)存空間,最后你的JVM進(jìn)程最多就是2G內(nèi)存
然后這2G還得分配給方法區(qū)、棧內(nèi)存、堆內(nèi)存幾塊區(qū)域,那么堆內(nèi)存可能最多就是個1G多的內(nèi)存空間。
然后堆內(nèi)存還分為新生代和老年代,你的老年代總需要放置系統(tǒng)的一些長期存活的對象吧,怎么也得給幾百MB的內(nèi)存空間,那么新生代可能也就幾百MB的內(nèi)存了。
這樣的話,大家可以看到,我們上述的核心業(yè)務(wù)流程,只不過僅僅是針對一個支付訂單對象來分析的,但是實際上如果擴(kuò)大10倍~20倍換成對完整系統(tǒng)的預(yù)估之后,我們看到,大致每秒會占據(jù)1MB左右的內(nèi)存空間。
那么如果你新生代就幾百MB的內(nèi)存空間,是不是會導(dǎo)致運行幾百秒之后,新生代內(nèi)存空間就滿了?此時是不是就得觸發(fā)Minor GC了?
其實如果這么頻繁的觸發(fā)Minor GC,會影響線上系統(tǒng)的性能穩(wěn)定性的。
這里大家首先要明白的一點,就是頻繁觸發(fā)GC一定不是什么好事兒。
因此你可以考慮采用4核8G的機(jī)器來部署支付系統(tǒng),那么你的JVM進(jìn)程至少可以給4G以上內(nèi)存,新生代在里面至少可以分配到2G內(nèi)存空間
這樣子就可以做到可能新生代每秒多1MB左右的內(nèi)存,但是需要將近半小時到1小時才會讓新生代觸發(fā)Minor GC,這就大大降低了GC的頻率。
舉個例子:機(jī)器采用4核8G,然后-Xms和-Xmx設(shè)置為3G,給整個堆內(nèi)存3G內(nèi)存空間,-Xmn設(shè)置為2G,給新生代2G內(nèi)存空間。
而且假設(shè)你的業(yè)務(wù)量如果更大,你可以考慮不只部署3臺機(jī)器,可以橫向擴(kuò)展部署5臺機(jī)器,或者10臺機(jī)器,這樣每臺機(jī)器處理的請求更少,對JVM的壓力更小。