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