我進行jvm內存調優的一些記錄

jvm內存調優的一些記錄

java內存調優的方法和過程
可使用
jmap -heap pid號 查看,例如pid是9300,執行的結果多是這樣的。java

root@ubuntu:~# jmap -heap 9300
Attaching to process ID 9300, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11

using thread-local object allocation.
Parallel GC with 18 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4190109696 (3996.0MB)
   NewSize                  = 87031808 (83.0MB)
   MaxNewSize               = 1396703232 (1332.0MB)
   OldSize                  = 175112192 (167.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 378535936 (361.0MB)
   used     = 13720728 (13.085105895996094MB)
   free     = 364815208 (347.9148941040039MB)
   3.6246830736831286% used
From Space:
   capacity = 164626432 (157.0MB)
   used     = 0 (0.0MB)
   free     = 164626432 (157.0MB)
   0.0% used
To Space:
   capacity = 162529280 (155.0MB)
   used     = 0 (0.0MB)
   free     = 162529280 (155.0MB)
   0.0% used
PS Old Generation
   capacity = 339738624 (324.0MB)
   used     = 18348624 (17.498611450195312MB)
   free     = 321390000 (306.5013885498047MB)
   5.400806003146702% used

20544 interned Strings occupying 2562384 bytes.

咱們最關注的是Old Generation的佔用狀況。從數據上看到佔用大約17.49m。
按照java官方的說明來配置的話計算的基數是老年時代存活實例的倍數。ubuntu

Java整個堆大小設置,Xmx 和 Xms設置爲老年代存活對象的3-4倍,即FullGC以後的老年代內存佔用的3-4倍
永久代 PermSize和MaxPermSize設置爲老年代存活對象的1.2-1.5倍。
年輕代Xmn的設置爲老年代存活對象的1-1.5倍。
老年代的內存大小設置爲老年代存活對象的2-3倍。

這樣計算下來,
Xmx與Xms 大約是300~400M(17.49按100M計算)
Xmn能夠設置爲128M,也就是1.2倍
PerSize與MaxPermSize是120M~150Mjvm

以上的說的是heap堆內存的設置。沒完,還有。spa

非堆內存:
還必須的說下 -XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;
由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。

PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域。
XX:MaxPermSize設置太小會致使java.lang.OutOfMemoryError: PermGen space 就是內存益出。 
這部份內存用於存放元數據信息。若是2G內存、64那麼計算下來只有32M內存用於存放數據了,就容易產生這個OutOfMemoryError:PermGen Space這個錯誤了。

(1)這一部份內存用於存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不一樣。 
(2)GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,因此若是你的APP會LOAD不少CLASS 的話,就極可能出現PermGen space錯誤。

因此若是運行的機器內存比較小,而咱們須要引用大量的jar包,好比體積50M的jar包,那麼就會出現內存溢出的問題了,這時候須要咱們特殊制定一次這個內存的參數。通常大於引用jar包的體積總量就能夠了。
還有啓動的時候 -XX:+UseParallelGC,這個參數也能夠稍稍提升一些GC的速度。

java -jar -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+UseParallelGC 我是一個jar包.jarcode

好比PS Old Generation 實際佔用32M對象

java -jar -Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256m -XX:+UseParallelGC內存

相關文章
相關標籤/搜索