亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

對Docker-java項目進行jvm調優(yōu)-內存方式

 更新時間:2024年09月25日 10:15:10   作者:背風衣人  
本文詳細介紹了如何進入Docker容器并分析Java進程的內存使用情況,通過使用jps和jstat工具,可以查看java進程列表及內存池容量,討論了設置JVM參數-Xmx和-Xms相等的重要性,以避免堆內存的頻繁調整,此外,還探討了FullGC觸發(fā)條件和元空間的配置

1. 分析內存使用情況

1.1 進入docker容器

# 查看容器列表
docker ps
# 根據容器name或id進入容器命令行終端
docker exec -it <container_name> bash

1.2 通過jps查看當前java進程列表

三種不同詳細程度的進程列表(主要是獲取java進程的lvmid)

root@21e4300860c8:/# jps
1 jar
79 Jps

root@21e4300860c8:/# jps -l
1 /knx-organization-service-exec.jar
127 sun.tools.jps.Jps

root@21e4300860c8:/# jps -lv
1 /knx-organization-service-exec.jar -Xmx512m -Xms512m -Dspring.profiles.active=dev,jiewli -Djasypt.encryptor.password= -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=18000
139 sun.tools.jps.Jps -Dapplication.home=/usr/lib/jvm/java-8-openjdk-amd64 -Xms8m

1.3 通過jstat -gccapacity統(tǒng)計java進程的內存池容量

root@21e4300860c8:/# jstat -gccapacity -h 20 1 250
NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
174592.0 174592.0 174592.0 7680.0 8704.0 157184.0   349696.0   349696.0   349696.0   349696.0      0.0 1136640.0  98280.0      0.0 1048576.0  11904.0     46     4
174592.0 174592.0 174592.0 7680.0 8704.0 157184.0   349696.0   349696.0   349696.0   349696.0      0.0 1136640.0  98280.0      0.0 1048576.0  11904.0     46     4
174592.0 174592.0 174592.0 7680.0 8704.0 157184.0   349696.0   349696.0   349696.0   349696.0      0.0 1136640.0  98280.0      0.0 1048576.0  11904.0     46     4
174592.0 174592.0 174592.0 7680.0 8704.0 157184.0   349696.0   349696.0   349696.0   349696.0      0.0 1136640.0  98280.0      0.0 1048576.0  11904.0     46     4
174592.0 174592.0 174592.0 7680.0 8704.0 157184.0   349696.0   349696.0   349696.0   349696.0      0.0 1136640.0  98280.0      0.0 1048576.0  11904.0     46     4
174592.0 174592.0 174592.0 7680.0 8704.0 157184.0   349696.0   349696.0   349696.0   349696.0      0.0 1136640.0  98280.0      0.0 1048576.0  11904.0     46     4
174592.0 174592.0 174592.0 7680.0 8704.0 157184.0   349696.0   349696.0   349696.0   349696.0      0.0 1136640.0  98280.0      0.0 1048576.0  11904.0     46     4

說明:

  1. 新生代空間由Survivor0Survivor1、Eden(幸存者空間0、幸存者空間1、伊甸園)三部分組成
  2. OGC = sum(all OC),目前老年代只有一個空間,故而OGCOC相等??梢蕴骄恳幌吕夏甏卸鄠€空間的時候有什么差異。
  3. JVM參數-Xmx512m最大堆內存等于NGCMX + OGCMX
  4. JVM參數-Xms512m最小堆內存等于NGCMN + OGCMN
  5. 將堆的最小值-Xms參數與最大值-Xmx參數設置為一樣即可避免堆自動擴展。因為JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;JVM最大分配的內存由-Xmx指定,默認是物理內存的1/4。默認空余堆內存小于40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大于70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設置-Xms、-Xmx相等以避免在每次GC后調整堆的大小。對象的堆內存由稱為垃圾回收器的自動內存管理系統(tǒng)回收。
  6. Full GC觸發(fā)條件:
  • 調用System.gc
  • 老年代空間不足
  • 方法區(qū)空間不足
  • 通過Minor GC(新生代GC)后進入老年代的平均大小大于老年代的可用內存
  • 由Eden區(qū)、From Space區(qū)向To Space區(qū)復制時,對象大小大于To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小于該對象大小

JVM參數-XX:MetaspaceSize元空間初始化內存大小,默認是20.79MB,超過20.79MB后,每次元空間擴增都會觸發(fā)Full GC,所以這個值設大一點可以減少Full GC次數。

JVM參數-XX:MaxMetaspaceSize元空間最大內存大小,默認是無限(超過宿主機內存視為與宿主機內存一致),設置這個值,可以避免在發(fā)生故障時占用大量宿主機內存資源,影響其他服務。

列代碼列名容量(kB)容量(MB)
NGCMN初始新生代空間容量174592.0170.5
NGCMX最大新生代空間容量174592.0170.5
NGC當前新生代容量174592.0170.5
S0C當前幸存者空間0容量7680.07.5
S1C當前幸存者空間1容量8704.08.5
EC當前Eden(伊甸園)區(qū)空間容量157184.0153.5
OGCMN初始老年代空間容量349696.0341.5
OGCMX最大老年代空間容量349696.0341.5
OGC當前老年代空間容量349696.0341.5
MCMN初始元空間容量0.00
MCMX最大元空間容量1136640.01,110
MC當前元空間容量98280.095.9765625
CCSMN壓縮的類空間初始容量0.00
CCSMX壓縮的類空間最大容量1048576.01,024
CCSC當前壓縮的類空間容量11904.011.625
YGC新生代GC事件數量46
FGC完整GC事件數量4

1.4 也可以通過jstat -gc來統(tǒng)計

root@7f9fbd4518a4:/# jstat -gc -h 20 1 250
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
10240.0 10240.0 2416.0  0.0   154112.0 123601.6  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071
10240.0 10240.0 2416.0  0.0   154112.0 123601.6  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071
10240.0 10240.0 2416.0  0.0   154112.0 123601.6  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071
10240.0 10240.0 2416.0  0.0   154112.0 123893.9  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071
10240.0 10240.0 2416.0  0.0   154112.0 123893.9  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071
10240.0 10240.0 2416.0  0.0   154112.0 123893.9  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071
10240.0 10240.0 2416.0  0.0   154112.0 123893.9  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071
10240.0 10240.0 2416.0  0.0   154112.0 123893.9  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071
10240.0 10240.0 2416.0  0.0   154112.0 123893.9  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071
10240.0 10240.0 2416.0  0.0   154112.0 123893.9  349696.0   60088.4   81112.0 75681.7 9432.0 8462.8     38    1.640   3      0.431    2.071

說明:

列代碼列名KBMB備注
S0C幸存者空間0容量10240.010
S1C幸存者空間1容量10240.010
S0U幸存者空間1利用率2416.02.35
S1U幸存者空間1利用率0.00.0
ECEden(伊甸園)空間容量154112.0150.5
EUEden(伊甸園)空間利用率123601.0120.70
OC老年代空間容量349696.0341.5
OU老年代空間利用率60088.058.67
MC元空間容量81112.079.21
MU元空間利用率75681.773.90
CCSC壓縮類空間容量9432.09.21Compressed class space capacity,對應參數-XX:CompressedClassSpaceSize
CCSU壓縮類空間利用率8462.08.26
YGC新生代GC事件次數38
YGCT新生代GC事件時間1.640
FGCFull GC事件次數3
FGCTFull GC事件時間0.431
GCT總GC時間2.071

1.5 通過jstat -gcutil統(tǒng)計java進程的垃圾收集統(tǒng)計信息

不限制采集次數,采集過程中盡量模擬一般情況下的系統(tǒng)調用情況,直到觸發(fā)gc事件。

觸發(fā)一次新生代GC事件Minor GC(觀察YGC數量+1)

root@21e4300860c8:/# jstat -gcutil -h 20 1 250
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT  
  0.00   8.68  98.93  16.94  92.54  89.70     49    1.761     4    0.908    2.669
  0.00   8.68  98.96  16.94  92.54  89.70     49    1.761     4    0.908    2.669
  0.00   8.68  98.96  16.94  92.54  89.70     49    1.761     4    0.908    2.669
  0.00   8.68  98.96  16.94  92.54  89.70     49    1.761     4    0.908    2.669
  0.00   8.68  98.96  16.94  92.54  89.70     49    1.761     4    0.908    2.669
  6.80   0.00   0.00  16.95  92.52  89.72     50    1.766     4    0.908    2.673
  6.80   0.00   0.74  16.95  92.52  89.72     50    1.766     4    0.908    2.673
  6.80   0.00   1.27  16.95  92.52  89.72     50    1.766     4    0.908    2.673
  6.80   0.00   2.67  16.95  92.52  89.72     50    1.766     4    0.908    2.673
  6.80   0.00   2.67  16.95  92.52  89.72     50    1.766     4    0.908    2.673
  6.80   0.00   2.67  16.95  92.52  89.72     50    1.766     4    0.908    2.673
  6.80   0.00   2.67  16.95  92.52  89.72     50    1.766     4    0.908    2.673

觸發(fā)一次完整GC事件Full GC,如果空間過大,一般情況下無法人為觸發(fā),需要通過時間等待(項目啟動時間除以FGC可知多長時間觸發(fā)一次Full GC),一般是1小時觸發(fā)一次Full GC。

或許也可以讓survivor空間利用率接近100%觸發(fā)Full GC。

root@21e4300860c8:/# jstat -gcutil -h 20 1 250
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  99.67  53.34  19.88  93.38  90.50     45    1.680     3    0.627    2.308
  0.00  99.67  55.03  19.88  93.38  90.50     45    1.680     3    0.627    2.308
  0.00  99.67  55.03  19.88  93.38  90.50     45    1.680     3    0.627    2.308
  0.00  99.67  55.03  19.88  93.38  90.50     45    1.680     3    0.627    2.308
  0.00  99.67  56.72  19.88  93.38  90.50     45    1.680     3    0.627    2.308
  0.00  99.67  56.72  19.88  93.38  90.50     45    1.680     3    0.627    2.308
 28.13   0.00   0.00  21.17  93.02  90.13     46    1.729     4    0.627    2.356
  0.00   0.00   0.00  16.94  92.41  89.38     46    1.729     4    0.908    2.637
  0.00   0.00   0.84  16.94  92.41  89.38     46    1.729     4    0.908    2.637
  0.00   0.00   0.84  16.94  92.41  89.38     46    1.729     4    0.908    2.637
  0.00   0.00   0.84  16.94  92.41  89.38     46    1.729     4    0.908    2.637
  0.00   0.00   0.90  16.94  92.41  89.38     46    1.729     4    0.908    2.637
  0.00   0.00   0.92  16.94  92.41  89.38     46    1.729     4    0.908    2.637
  0.00   0.00   0.92  16.94  92.41  89.38     46    1.729     4    0.908    2.637

1.6 查看元空間情況

# 查看java實例的某個參數
# 查看MetaspaceSize的值,默認是-XX:MetaspaceSize=21807104(20.79 MB)
jinfo -flag MetaspaceSize <jvmid>
# 查看MaxMetaspaceSize的值,默認是-XX:MaxMetaspaceSize=18446744073709547520(數值超過宿主機最大內存,視為無限或與宿主機一致)
jinfo -flag MaxMetaspaceSize <jvmid>

1.7 查看docker容器狀態(tài)

# 在docker容器外部(宿主機)終端
docker stats
# 查看某個docker容器的狀態(tài)
docker stats <container_name | id>

命令結果如下:

CONTAINER ID   NAME                       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O     PIDS
38b70395877a   knx-organization-service   0.49%     426.4MiB / 3.682GiB   11.31%    4.88MB / 4.35MB   47.6MB / 0B   57
7f9fbd4518a4   user-account-service       0.38%     479.4MiB / 3.682GiB   12.71%    1.84MB / 2.67MB   72.1MB / 0B   48

說明:

列名描述
CONTAINER ID and Name容器的ID和名稱
CPU % and MEM %容器正在使用的主機CPU和內存的百分比
MEM USAGE / LIMIT容器正在使用的總內存以及允許使用的總內存量
NET I/O容器通過其網絡接口發(fā)送和接收的數據量
BLOCK I/O容器已從主機上的塊設備讀取和寫入的數據量
PIDs容器創(chuàng)建的進程或線程數

I/O設備大致分為兩類:塊設備和字符設備。塊設備將信息存儲在固定大小的塊中,每個塊都有自己的地址。

數據塊的大小通常在512字節(jié)到32768字節(jié)之間。塊設備的基本特征是每個塊都能獨立于其它塊而讀寫。磁盤是最常見的塊設備

基于結果第一條可知:

  1. docker容器的內存最大限制是3.682GiB,實際上就是宿主機的整個內存,相當于無限制。
  2. docker容器已使用的內存大小是426.4MiB,與11.31% * 3.682GiB一致,實際上就是容器內java進程的實際內存使用大?。ê芙咏f明docker容器除了服務外沒有多少額外內存消耗。
  3. docker容器內的進程或線程數為57,進程只有一個java服務,所以可以視為java服務的線程數量。

1.8 計算性能參數

已知當前老年代空間容量為341.5 MB,再根據新生代GC和Full GC兩種事件過程采集的結果可以計算出:

  1. 老年代空間利用率:16.94% ~ 21.17%
  2. 老年代空間利用大小區(qū)間:57.8501 MB ~ 72.29555 MB
  3. 默認老年代占堆內存的2/3,可以計算出適合的最小堆大?。?2.29555/0.66=109.53871 MB
  4. 將最小堆大小往上推一個最接近的1024整除數:1024/8=128 MB
  5. 非堆內存不會被垃圾收集,可以視為永久代,當前使用了多少,基本上就只需要多少,根據CCSC往上推算最接近的1024整除數:1024/64=16 MB
  6. 當前線程為57個,考慮到當前實例是開發(fā)環(huán)境,并發(fā)率很低,算作最大線程為100個

2. 修改JVM參數-Xmx、-Xms、-XX:MetaspaceSize、-XX:MaxMetaspaceSize

Java8開始已經移除了永久代空間(PermGen或permanent generation)即-XX:PermSize、-XX:MaxPermSize兩個參數是無效的。

取而代之的是元空間(metaspace):

  • -XX:MetaspaceSize:最小元空間大小:并非初始化元空間大小,元空間一開始是0,并且不斷擴增,直到MetaspaceSize,都不會觸發(fā)Full GC,而一旦擴增超過MetaspaceSize后,每次擴增都會觸發(fā)Full GC
  • -XX:MaxMetaspaceSize:最大元空間大小:擴增的上限,默認是無限,設置一個值,避免一個服務因錯誤地不斷加載類而占用整個服務器的內存,從而影響其他服務的運行。

修改項目鏡像的Dockerfilejava命令的JVM參數

java \
-Xmx128m \
-Xms128m \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=256m \
......

并且重新構建鏡像并運行。

3. 預估Docker容器的內存限制

Max memory = [-Xmx] + [-XX:MaxMetaspaceSize] + number_of_threads * [-Xss]

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 使用Docker部署Dashdot服務器儀表盤的步驟

    使用Docker部署Dashdot服務器儀表盤的步驟

    Dashdot是一款簡單、實用的開源服務器儀表盤,設計時考慮到了玻璃形態(tài),它旨在用于較小的?VPS?和私人服務器,這篇文章主要介紹了使用Docker部署Dashdot服務器儀表盤,需要的朋友可以參考下
    2022-12-12
  • 在windows下的安裝Docker的教程

    在windows下的安裝Docker的教程

    這篇文章主要介紹了在windows下的安裝Docker的教程,注意只能是64的系統(tǒng),需要的朋友可以參考下
    2015-12-12
  • 開發(fā)者必備Docker命令小結

    開發(fā)者必備Docker命令小結

    本文主要講解Docker環(huán)境的安裝以及Docker常用命令的使用,掌握這些對Docker環(huán)境下應用的部署具有很大幫助,感興趣的可以了解一下
    2021-12-12
  • Docker之cAdvisor的安裝使用方式

    Docker之cAdvisor的安裝使用方式

    這篇文章主要介紹了Docker之cAdvisor的安裝使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 使用docker部署java項目運行環(huán)境的實現步驟

    使用docker部署java項目運行環(huán)境的實現步驟

    本文主要介紹了使用docker部署java項目運行環(huán)境的實現步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Docker搭建LibreSpeed的實現步驟

    Docker搭建LibreSpeed的實現步驟

    LibreSpeed 是一個輕量級的網絡速度測試工具,本文主要介紹了Docker搭建LibreSpeed的實現步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • 解決docker掛載的目錄無法讀寫問題

    解決docker掛載的目錄無法讀寫問題

    這篇文章主要介紹了解決docker掛載的目錄無法讀寫問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Docker拉取鏡像超時的原因分析與解決方法

    Docker拉取鏡像超時的原因分析與解決方法

    這篇文章主要為大家詳細介紹了Docker在拉取鏡像時超時的相關原因分析與解決方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-04-04
  • 查找Docker容器IP地址的四種方法

    查找Docker容器IP地址的四種方法

    在使用 Docker 管理和部署應用程序時,了解容器的 IP 地址是非常重要的,每個 Docker 容器都有其自己的 IP 地址,本文將介紹幾種常用的方法,幫助您輕松查找 Docker 容器的 IP 地址,需要的朋友可以參考下
    2024-07-07
  • Docker?link實現容器互聯的方式

    Docker?link實現容器互聯的方式

    通過link方式創(chuàng)建容器,然后我們可以使用被link容器的別名進行訪問。本文重點給大家介紹Docker?link實現容器互聯的方式,感興趣的朋友一起看看吧
    2021-12-12

最新評論