1. 程式人生 > >關於docker執行Java程式JVM配置引數使用jconsole的簡單量化過程

關於docker執行Java程式JVM配置引數使用jconsole的簡單量化過程

1.如果服務可以本地啟動那麼儘量在本地進行引數預估

2.如果服務不能本地啟動,可以使用遠端連線方式進行預估

 

3.衡量要點:

Java程式執行大致分為三塊:堆記憶體,非堆記憶體(虛擬機器棧,方法區,本地方法棧,程式計數器),堆外記憶體.

docker容器中執行除了Java程式還需要為其餘程式餘力記憶體空間.這裡假設統一預留50M空間.

3.1 堆記憶體的量化

堆記憶體主要分為幾個區域,新生代,複製區,老年代.考慮GC會大量回收堆記憶體空間,只要不發生記憶體逸出和記憶體

洩露情況,堆記憶體能支援一定的併發即可.無線上資料參考情況可以,簡單預估QPS為3進行測試堆記憶體可能大小.

這裡以POIService為例子,啟動專案後連線後觀察情況如下.

訪問介面呼叫時,其各項資料.

圖中可以看出 堆記憶體最小可以到50M最大可大300M左右,堆記憶體主要用於例項化物件.我們這裡預估下 150M就夠用了.

為了線上穩定再次基礎上提升10%, 可配置固定記憶體大小為165M即引數 -Xmx165M -Xms165M

執行緒沒有及時進行回收,導致執行緒量一直在增加.需要優化相關程式碼.不然會導致執行緒佔用記憶體持續增加,JVM會為每個執行緒單獨

分配空間.

3.2 非堆記憶體量化

圖中可以看出,非堆記憶體使用量不是很大大概65M左右.

設定引數:-XX:PermSize=65M -XX:MaxPermSize=130M (1.8以前)

-XX:MetaspaceSize = 100M (1.8以後)

這裡預估為 165 + 100 + 20(對外記憶體) + 50 = 335M 這裡直接給400M

這裡要說下.因為資源有限才這麼設定,如果資源足夠可以進行GC時間的衡量來設定相關引數.

-Xmx180M -Xms180M -XX:MaxDirectMemorySize=20M -XX:MetaspaceSize=100M

調整後效果還可以,這裡主意,GC會導致STW可能影響響應時間,要去衡量那個是當前需要的.

 

遠端除錯嘗試

遠端連線配置如下:

[program:configservice]

command=java -Xmx180M -Xms180M -XX:MaxDirectMemorySize=20M -XX:MetaspaceSize=100M -Djava.rmi.server.hostname=106.75.105.45 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=19999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar -Dfile.encoding=UTF-8 configservice.jar

沒有限制前top觀察到記憶體使用快到1G了,限制後如下:

一天後再次觀察資料如下:

還是比較穩定的,目前使用記憶體 350M左右.線上給400M.