elasticsearch jvm優化

 

測試環境elasticsearch jvm 4G jdk1.8

[serveradm@test-log-server elasticsearch]$ java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
[serveradm@test-log-server elasticsearch]$ 

 

-Xms4g
-Xmx4g

 jmap -heap pid查看heap內存大小

複製代碼

[serveradm@test-log-server elasticsearch]$ jmap -heap 11516
Attaching to process ID 11516, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.212-b10

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 348913664 (332.75MB)
   MaxNewSize               = 348913664 (332.75MB)
   OldSize                  = 3946053632 (3763.25MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 314048512 (299.5MB)
   used     = 275463512 (262.70247650146484MB)
   free     = 38585000 (36.797523498535156MB)
   87.7136816365492% used
Eden Space:
   capacity = 279183360 (266.25MB)
   used     = 245544536 (234.16951751708984MB)
   free     = 33638824 (32.080482482910156MB)
   87.95099249468163% used
From Space:
   capacity = 34865152 (33.25MB)
   used     = 29918976 (28.532958984375MB)
   free     = 4946176 (4.717041015625MB)
   85.81341047932331% used
To Space:
   capacity = 34865152 (33.25MB)
   used     = 0 (0.0MB)
   free     = 34865152 (33.25MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 3946053632 (3763.25MB)
   used     = 27565128 (26.28815460205078MB)
   free     = 3918488504 (3736.961845397949MB)
   0.6985492487092482% used

複製代碼

主要信息如下:

MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 348913664 (332.75MB)
MaxNewSize = 348913664 (332.75MB)
OldSize = 3946053632 (3763.25MB)
NewRatio = 2

通過https://www.jianshu.com/p/832fc4d4cb53計算可得:

默認情況下和cpu核數有關:

64M * 4 * 13 / 10 = 332.8M

max_heap / (NewRatio+1) 的值爲4096M / 3 = 1365M

符合文章所說的大小

所以,YoungGen 的大小在沒有設置的情況下是通過計算得出的,其大小可能與 NewRatio 的默認配置沒什麼關係而與ParallelGCThreads 的配置有一定的關係。
那麼既然 YoungGen 大小有不確定性,我們最好還是通過這些 -XX:NewSize、-XX:MaxNewSize 或者 -xmn 參數設置下


設置參數:

-Xms4g
-Xmx4g
-XX:NewRatio=4

 

複製代碼

[serveradm@test-log-server elasticsearch]$ jmap -heap 11885
Attaching to process ID 11885, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.212-b10

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 858980352 (819.1875MB)
   MaxNewSize               = 858980352 (819.1875MB)
   OldSize                  = 3435986944 (3276.8125MB)
   NewRatio                 = 4
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 773128192 (737.3125MB)
   used     = 486640352 (464.0964050292969MB)
   free     = 286487840 (273.2160949707031MB)
   62.94432890115072% used
Eden Space:
   capacity = 687276032 (655.4375MB)
   used     = 413461664 (394.3077697753906MB)
   free     = 273814368 (261.1297302246094MB)
   60.15947665115142% used
From Space:
   capacity = 85852160 (81.875MB)
   used     = 73178688 (69.78863525390625MB)
   free     = 12673472 (12.08636474609375MB)
   85.23802779103053% used
To Space:
   capacity = 85852160 (81.875MB)
   used     = 0 (0.0MB)
   free     = 85852160 (81.875MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 3435986944 (3276.8125MB)
   used     = 25476440 (24.296226501464844MB)
   free     = 3410510504 (3252.516273498535MB)
   0.7414591619589112% used

複製代碼

此時heap信息如下:

MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 858980352 (819.1875MB)
MaxNewSize = 858980352 (819.1875MB)
OldSize = 3435986944 (3276.8125MB)
NewRatio = 4

 

堆內存查看:

jstat -gc pid 默認單位k
[serveradm@test-log-server elasticsearch]$ jstat -gc 11885
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 
83840.0 83840.0 0.0 13404.3 671168.0 644823.4 3355456.0 250260.3 83012.0 76771.6 12156.0 10227.8 21 0.771 4 0.246 1.017
[serveradm@test-log-server elasticsearch]$
  • S0C:survivor0區總內存大小(Capacity)
  • S1C: survivor1區總內存大小
  • S0U: survivor0區當前內存大小(Used)
  • S1U: survivor1區當前內存大小
  • EC:Eden區總內存大小
  • EU:Eden區當前內存大小
  • OC:老年代總內存大小
  • OU:老年代當前內存大小
  • MC:meta data區總內存大小
  • MU:meta data區當前內存大小

所以:

NewSize=S0C+S1C+EC

 OldSize=OC

jvm常用參數:

-Xms :表示java虛擬機堆區內存初始內存分配的大小

-Xmx:表示java虛擬機堆區內存可被分配的最大上限

通常會將-Xms 與-Xmx兩個參數的配置相同的值,其目的是爲了能夠在java垃圾回收機制清理完堆區後不需要重新分隔計算堆區的大小而浪費資源

-XX:newSize:表示新生代初始內存的大小,應該小於-Xms的值

-XX:MaxnewSize:表示新生代可被分配的內存的最大上限;當然這個值應該小於-Xmx的值;

-Xmn:至於這個參數則是對 -XX:newSize、-XX:MaxnewSize兩個參數的同時配置,也就是說如果通過-Xmn來配置新生代的內存大小,那麼-XX:newSize = -XX:MaxnewSize = -Xmn

java虛擬機對非堆區內存配置的兩個參數:
-XX:PermSize:表示非堆區初始內存分配大小(方法區)
-XX:MaxPermSize:表示對非堆區分配的內存的最大上限(方法區)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章