欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

對Docker-java項(xiàng)目進(jìn)行jvm調(diào)優(yōu)-內(nèi)存方式

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

1. 分析內(nèi)存使用情況

1.1 進(jìn)入docker容器

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

1.2 通過jps查看當(dāng)前java進(jìn)程列表

三種不同詳細(xì)程度的進(jìn)程列表(主要是獲取java進(jìn)程的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)計(jì)java進(jìn)程的內(nèi)存池容量

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

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

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

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

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

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,對應(yīng)參數(shù)-XX:CompressedClassSpaceSize
CCSU壓縮類空間利用率8462.08.26
YGC新生代GC事件次數(shù)38
YGCT新生代GC事件時(shí)間1.640
FGCFull GC事件次數(shù)3
FGCTFull GC事件時(shí)間0.431
GCT總GC時(shí)間2.071

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

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

觸發(fā)一次新生代GC事件Minor GC(觀察YGC數(shù)量+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ā),需要通過時(shí)間等待(項(xiàng)目啟動時(shí)間除以FGC可知多長時(shí)間觸發(fā)一次Full GC),一般是1小時(shí)觸發(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實(shí)例的某個(gè)參數(shù)
# 查看MetaspaceSize的值,默認(rèn)是-XX:MetaspaceSize=21807104(20.79 MB)
jinfo -flag MetaspaceSize <jvmid>
# 查看MaxMetaspaceSize的值,默認(rèn)是-XX:MaxMetaspaceSize=18446744073709547520(數(shù)值超過宿主機(jī)最大內(nèi)存,視為無限或與宿主機(jī)一致)
jinfo -flag MaxMetaspaceSize <jvmid>

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

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

命令結(jié)果如下:

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 %容器正在使用的主機(jī)CPU和內(nèi)存的百分比
MEM USAGE / LIMIT容器正在使用的總內(nèi)存以及允許使用的總內(nèi)存量
NET I/O容器通過其網(wǎng)絡(luò)接口發(fā)送和接收的數(shù)據(jù)量
BLOCK I/O容器已從主機(jī)上的塊設(shè)備讀取和寫入的數(shù)據(jù)量
PIDs容器創(chuàng)建的進(jìn)程或線程數(shù)

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

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

基于結(jié)果第一條可知:

  1. docker容器的內(nèi)存最大限制是3.682GiB,實(shí)際上就是宿主機(jī)的整個(gè)內(nèi)存,相當(dāng)于無限制。
  2. docker容器已使用的內(nèi)存大小是426.4MiB,與11.31% * 3.682GiB一致,實(shí)際上就是容器內(nèi)java進(jìn)程的實(shí)際內(nèi)存使用大?。ê芙咏?,說明docker容器除了服務(wù)外沒有多少額外內(nèi)存消耗。
  3. docker容器內(nèi)的進(jìn)程或線程數(shù)為57,進(jìn)程只有一個(gè)java服務(wù),所以可以視為java服務(wù)的線程數(shù)量。

1.8 計(jì)算性能參數(shù)

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

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

2. 修改JVM參數(shù)-Xmx、-Xms、-XX:MetaspaceSize、-XX:MaxMetaspaceSize

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

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

  • -XX:MetaspaceSize:最小元空間大?。翰⒎浅跏蓟臻g大小,元空間一開始是0,并且不斷擴(kuò)增,直到MetaspaceSize,都不會觸發(fā)Full GC,而一旦擴(kuò)增超過MetaspaceSize后,每次擴(kuò)增都會觸發(fā)Full GC
  • -XX:MaxMetaspaceSize:最大元空間大?。簲U(kuò)增的上限,默認(rèn)是無限,設(shè)置一個(gè)值,避免一個(gè)服務(wù)因錯(cuò)誤地不斷加載類而占用整個(gè)服務(wù)器的內(nèi)存,從而影響其他服務(wù)的運(yùn)行。

修改項(xiàng)目鏡像的Dockerfilejava命令的JVM參數(shù)

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

并且重新構(gòu)建鏡像并運(yùn)行。

3. 預(yù)估Docker容器的內(nèi)存限制

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

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

    使用Docker部署Dashdot服務(wù)器儀表盤的步驟

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

    在windows下的安裝Docker的教程

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

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

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

    Docker之cAdvisor的安裝使用方式

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

    使用docker部署java項(xiàng)目運(yùn)行環(huán)境的實(shí)現(xiàn)步驟

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

    Docker搭建LibreSpeed的實(shí)現(xiàn)步驟

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

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

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

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

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

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

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

    Docker?link實(shí)現(xiàn)容器互聯(lián)的方式

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

最新評論