最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

對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統計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. 新生代空間由Survivor0、Survivor1、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后調整堆的大小。對象的堆內存由稱為垃圾回收器的自動內存管理系統回收。
  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來統計

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統計java進程的垃圾收集統計信息

不限制采集次數,采集過程中盡量模擬一般情況下的系統調用情況,直到觸發(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進程的實際內存使用大?。ê芙咏?,說明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,可以計算出適合的最小堆大小:72.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中部署Mysql并掛載配置文件的步驟詳解

    在Docker中部署Mysql并掛載配置文件的步驟詳解

    Docker是一種流行的容器化平臺,可以簡化應用程序的部署和管理,本文我們將給大家詳細介紹在 Docker 中部署 MySQL 并掛載配置文件的詳細步驟,需要的朋友可以參考下
    2023-09-09
  • docker-compose基于MySQL8部署項目的實現

    docker-compose基于MySQL8部署項目的實現

    這篇文章主要介紹了docker-compose基于MySQL8部署項目的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 使用Docker打包和運行Java鏡像的完整指南

    使用Docker打包和運行Java鏡像的完整指南

    在這篇文章中,我們將詳細講解如何使用Docker打包和運行一個Java應用鏡像,通過此教程,即使你是一個小白,也能輕松學會如何構建Docker鏡像并運行Java應用,感興趣的小伙伴跟著小編一起來看看吧
    2025-01-01
  • 遷移docker部署的gitlab過程(經實戰(zhàn))

    遷移docker部署的gitlab過程(經實戰(zhàn))

    本文詳細描述了如何將Docker部署的GitLab數據遷移到另一塊硬盤的過程,包括包括停止容器、遷移數據卷、修改掛載路徑、修正權限和重啟容器等等每一步驟都有詳細的說明確保遷移過程的安全性和有效性
    2026-05-05
  • docker-compose啟動mysql雙機熱備互為主從的方法實現

    docker-compose啟動mysql雙機熱備互為主從的方法實現

    本文主要介紹了docker-compose啟動mysql雙機熱備互為主從的方法實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • docker安裝sentinel的實現示例

    docker安裝sentinel的實現示例

    本文主要介紹了docker安裝sentinel的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • 使用DockerFile構建docker鏡像掛載目錄,數據卷同步問題

    使用DockerFile構建docker鏡像掛載目錄,數據卷同步問題

    這篇文章主要介紹了使用DockerFile構建docker鏡像掛載目錄,數據卷同步問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 騰訊云服務器docker開啟端口后無法訪問的解決方法

    騰訊云服務器docker開啟端口后無法訪問的解決方法

    本文主要介紹了騰訊云服務器docker開啟端口后無法訪問的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Docker數據備份恢復實現過程詳解

    Docker數據備份恢復實現過程詳解

    這篇文章主要介紹了Docker數據備份恢復實現過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Docker安裝阿里云服務器和在虛擬機安裝遇到的坑(問題小結)

    Docker安裝阿里云服務器和在虛擬機安裝遇到的坑(問題小結)

    這篇文章主要介紹了Docker安裝阿里云服務器和在虛擬機安裝遇到的坑,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

峨眉山市| 庄河市| 南安市| 扎囊县| 上蔡县| 湖口县| 四川省| 阳山县| 山阳县| 桂林市| 苗栗市| 高州市| 太康县| 广平县| 秦皇岛市| 贵南县| 加查县| 新干县| 昌吉市| 保康县| 长治县| 洪湖市| 库车县| 荆州市| 独山县| 长治市| 萝北县| 乐昌市| 隆子县| 九龙城区| 方正县| 泗阳县| 松潘县| 措勤县| 青铜峡市| 华安县| 吉安市| 会同县| 柳林县| 古交市| 中西区|