docker生產(chǎn)環(huán)境jvm性能優(yōu)化方式
docker生產(chǎn)環(huán)境jvm性能優(yōu)化
1、xmx與xms設置多大合適
docker獲得的mem_usage的大小是從外部得到的java進程的內存大小,不僅僅是 -Xmx設置的大小,如果 -Xmx和docker分配的內存一致的話,由于java應用其他的地方還要占用不少的內存,導致還沒有到達 -Xmx的時候就沒有可以用的內存了,所以被docker容器給干掉了,從而出現(xiàn)了oom的情況。
java程序啟動的時候需要哪些方面的內存呢?
- java程序的堆內存,最大就是 -Xmx設置的這個值
- Garbage collection在垃圾回收的時候使用的內存
- JIT optimization使用的內存
- java程序的Off-heap所使用的內存
- java程序的Metaspace所使用的內存
- JNI Code所占用的內存
- jvm啟動的時候所占用的內存。
如何大體估算java進程使用的內存呢?
Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]
猜測在設置jvm啟動參數(shù)的時候 -Xmx的這個值一般要小于docker限制內存數(shù),經(jīng)過生產(chǎn)環(huán)境實驗 -Xmx:docker的比例為 2/3 - 3/4,
一般生產(chǎn)環(huán)境都是用的sunjdk
所以建議xmx與xms設置一樣大
- 避免JVM在運行過程中向OS申請內存
- 延后啟動后首次GC的發(fā)生時機
- 減少啟動初期的GC次數(shù)
- 避免動態(tài)調整jvm堆大小
2、xmn或者maxnewSize設置
xmn設置年輕代大小。
如果只是一些業(yè)務較簡單的基礎服務建議xmn設置為xmx的一半。
3、當xmx設置大于4G時
設置垃圾回收器 -XX:+UseG1GC
當堆內存很大時如果還是使用并發(fā)收集器,會造成gc收集比較長,這時可以將并行收集改成G1回收器
4、容器中最好增加-XX:ParallelGCThreads設置
該值可以設置為cpu核數(shù)
由于ParallelGCThreads的值默認是等于cpu核數(shù),但是有的生產(chǎn)環(huán)境獲取的是容器宿主機器的cpu核數(shù),這就導致cpu核數(shù)太多,效率變差,gc時間會延長。
jvm docker支持啟動參數(shù)
XX:+UseContainerSupport:啟用容器支持,JVM 將自動檢測并使用容器特定的內存限制。-XX:InitialRAMPercentage=68:JVM 初始堆大小為主機可用內存的百分之68。-XX:MaxRAMPercentage=68:JVM 最大堆大小為主機可用內存的百分之68。-XX:+UseG1GC:開啟 G1 垃圾回收器。-XX:+UnlockExperimentalVMOptions:解鎖實驗性 VM 選項,以便使用實驗性功能。-XX:G1NewSizePercent=60:設置新生代大小占堆大小的比例為60%。-XX:ParallelGCThreads=11:設置并行 GC 線程數(shù)為11。-XX:ConcGCThreads=4:設置并發(fā) GC 線程數(shù)為4。-XX:MaxGCPauseMillis=160:設置最大 GC 暫停時間為160毫秒。-XX:MetaspaceSize=120m:設置元空間初始大小為120MB。-XX:MaxMetaspaceSize=350m:設置元空間最大大小為350MB。-XX:MaxDirectMemorySize=300m:設置直接內存最大大小為300MB。-XX:+HeapDumpOnOutOfMemoryError:在內存溢出時生成堆轉儲文件。-Dio.netty.eventLoopThreads=6:設置 Netty EventLoop 線程數(shù)為6。-Dio.netty.tryReflectionSetAccessible=true:允許 Netty 反射調用私有方法。-Dlog4j2.formatMsgNoLookups=true:關閉 Log4j2 參數(shù)查找。-Dspring.profiles.active=sandbox:啟用 Spring Boot 的沙盒配置文件。–add-exports=java.base/jdk.internal.misc=ALL-UNNAMED:導出指定的包以供未命名模塊使用。-jar:指定 JAR 包的路徑和名稱。
綜上所述:
這些啟動參數(shù)可以優(yōu)化 JVM 的內存管理、垃圾回收、線程處理等方面的性能,提高應用程序的穩(wěn)定性和響應速度。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
docker安裝tomcat并部署Springboot項目war包的方法
這篇文章主要介紹了docker安裝tomcat并部署Springboot項目war包的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Dockerfile中multi-stage(多階段構建)詳解
在2017年5月3日即將發(fā)行的 Docker 17.05.0-ce 中,Docker 官方提供了簡便的多階段構建 (multi-stage build) 方案,下面這篇文章主要給大家介紹了關于Dockerfile中multi-stage(多階段構建)的相關資料,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。2018-03-03

