關於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.

 

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