测试并行回收报告
我們再來講一下并行收集,并行收集肯定比串行收集要高的,-XX:+UseParNewGC這個我們剛才講過的,他新生代是并行的,老年代是串行的,我們用并行收集器來掩飾一下效果,我們把它copy一下-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseParNewGC
-XX:PermSize=32M同樣一個道理,堆的初始值和最大值是一致的,我用的是并行收集器,運行一遍
這個時候運行的時候你們看一下,同樣道理,GC收集是0次,是不是這樣的,這個時候我們就可以得一個結論出來,GC他的回收是0次,這就跟你講一下,你們運行的時候不要在聚合報告菜單頁面運行,要在HTTP請求菜單界面運行,不然會影響到我們的測試報告的,看一下并行回收,他到底會有什么效果,你們覺得并行吞吐量大概會是多少呢,運行你們就知道了
看看多少,5136,我說過第一次會受到圖形界面的影響,你們不要以這個為主,我們再把它清掉一下
再運行一次,看一下效果,6544次,是不是變高了,第一次它會受到圖形界面的影響,這個我再把它清空一遍
6724次,我再清空,我再運行一遍
6686次,我們取最高值好吧,我再來運行一遍
運行看看效果,6706次,那我們取最高值,因為我們的項目比較簡單,GC回收是0次,但是吞吐量在6800,我們可以再去演示一下CMS收集器
CMS收集器也是并集收集器,剛才開始講那么多時間,主要是講堆的初始值是非常重要的一個知識點,我們現在講的都是堆的初始值和堆的最大值完全是一致的,保持一致的情況下和串行的最高,去做對比的,你們可以自己下去演示一下,如果想看效果的話你可以那我的代碼自己去測試一下,我們演示一下CMS收集器,我把這個改一下之后,我們再來看一下效果-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC
-XX:PermSize=32M
CMS收集器,然后我再運行一遍,你們可以看到垃圾回收的時候是0次,這個時候我清空掉,你們再看一下效果,我跟你講一下,我記得是7000多的,可能這個效果不好演示
我再運行一遍,因為我最高是達到一萬多的,我現在比較的是收集器,主要是這個效果不太好演示,你們下去搞個對象,讓別人去回收,這個不算完全特別準,但是我來表達什么意思,這個時候我們把G1演示一下-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseG1GC
-XX:PermSize=32M
G1里面會有一個日志記錄的,我來測一下G1里面效率有多高啊,我來看一下效果有多高,第一次都是5000多,第二次才會到6000多
有的人說把他改成32M,我把這個改小點,我來問一下你們,我如果把這個改小的情況下,我來問一下你們,你們覺得會不會發生GC日志的回收,會不會,你們猜一下,這個會不會,會不會發生GC回收,我們來運行一遍,你們看一下,會不會發生GC回收-XX:+PrintGCDetails -Xmx512M -Xms32M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseG1GC
-XX:PermSize=32M
這邊我講一下,這邊是不一樣的,有沒有GC日志的回收,我們不用G1,我們用CMS-XX:+PrintGCDetails -Xmx512M -Xms32M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC
-XX:PermSize=32M
我們用到的是CMS,我現在用的是CMS,你們看一下發生幾次了,你們自己說,是不是還是6次,我剛剛怎么講的,垃圾回收次數是和什么有關系,你們說一下,什么有關系,跟什么有關系,是不是還是6次,跟堆的初始值有關系,你們下去可以自己去創建對象,我這里演示的可能不是完全準,因為真正的測試是在linux下做測試的,而不是在window做測試的,這要是我們給你們講的,為什么啊,很少服務器是用windows的,所以給你們講一下,下去的時候真想看測試報告的話,你們下去搞一個Linux服務器,在linux服務器上做一個測試的,會看到非常非常詳細的,這是我要給你們說的一個點,而且你想一下,真正做測試的時候,你電腦上不可能有很多軟件的,真正做壓力測試的時候,是非常嚴格的,只能有服務器,不能有其他東西的,這樣才能最準,因為有的時候你在運行的時候,正好有其他的程序占內存所影響了,所以有的時候不準了,記住啊,你們下去做一個G1和CMS,那個效率高,你們下去可以做一個測試,比如new一個對象出來,看到底是什么效果,這個都是可以的,我在這邊就不細說了,那我們講一下,今天把JVM調優的基本知識大體的講一下,-XX:+HeapDumpOnOutOfMemoryError這個是打印堆溢出信息的,如果你不寫這個的話,GC就不會打印溢出的信息,有的人說我想改成32M,把最大值改成32M-XX:+PrintGCDetails -Xmx32M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC
-XX:PermSize=32M
我問一下你們,我們能不能這么做,初始值為64M,然后最大值為32M,這個可不可以,這肯定不可以的-XX:+PrintGCDetails -Xmx32M -Xms64M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC
-XX:PermSize=32M
絕對不行的,是不是報錯了
最大內存32M,申請的時候就申請不過來,這里改一下,改成32-XX:+PrintGCDetails -Xmx32M -Xms32M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC
-XX:PermSize=32M
你們看一下,同樣也是有6次,我們再來運行一遍,看下效果好不好,把它運行一遍
4960,首先我們肯定能知道的是什么呢,你如果堆的初始值比較小的情況下,吞吐量還是比較小的,但是你們可以對比一下,這個誤差可能不是很大,你們看一下,在最開始的時候,我們讓他數據相同的時候是多少次,5141次,小不了多少,這個可能是工具的原因,我再來運行一遍
6613次,也是回收兩次,是不是和我們剛才一樣,但是你發現沒有,這邊是6000多次,之前的時候是沒有到這么高的,這個你們自己下去摸索一下,我就不細講了
并行回收(UseParNewGC)
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseParNewGC
-XX:PermSize=32M
GC回收0次 吞吐量6800CMS收集器
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC
-XX:PermSize=32MG1回收方式
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseG1GC
-XX:PermSize=32M調優總結
初始堆值和最大堆內存內存越大,吞吐量就越高。
最好使用并行收集器,因為并行收集器速度比串行吞吐量高,速度快。
設置堆內存新生代的比例和老年代的比例最好為1:2或者1:3。
減少GC對老年代的回收。
?
總結
- 上一篇: jvm参数调优堆的初始和最大值一定要一致
- 下一篇: SOA和RPC讲解