赞
踩
# 查看容器列表
docker ps
# 根据容器name或id进入容器命令行终端
docker exec -it <container_name> bash
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
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
说明:
Survivor0
、Survivor1
、Eden
(幸存者空间0、幸存者空间1、伊甸园)三部分组成OGC = sum(all OC)
,目前老年代只有一个空间,故而OGC
与OC
相等。可以探究一下老年代有多个空间的时候有什么差异。-Xmx512m
最大堆内存等于NGCMX + OGCMX
-Xms512m
最小堆内存等于NGCMN + OGCMN
-Xms
参数与最大值-Xmx
参数设置为一样即可避免堆自动扩展。因为JVM初始分配的内存由-Xms
指定,默认是物理内存的1/64
;JVM最大分配的内存由-Xmx
指定,默认是物理内存的1/4
。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx
的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms
的最小限制。因此服务器一般设置-Xms
、-Xmx
相等以避免在每次GC后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。System.gc
时-XX:MetaspaceSize
元空间初始化内存大小,默认是20.79MB,超过20.79MB后,每次元空间扩增都会触发Full GC,所以这个值设大一点可以减少Full GC次数。-XX:MaxMetaspaceSize
元空间最大内存大小,默认是无限(超过宿主机内存视为与宿主机内存一致),设置这个值,可以避免在发生故障时占用大量宿主机内存资源,影响其他服务。列代码 | 列名 | 容量(kB) | 容量(MB) |
---|---|---|---|
NGCMN | 初始新生代空间容量 | 174592.0 | 170.5 |
NGCMX | 最大新生代空间容量 | 174592.0 | 170.5 |
NGC | 当前新生代容量 | 174592.0 | 170.5 |
S0C | 当前幸存者空间0容量 | 7680.0 | 7.5 |
S1C | 当前幸存者空间1容量 | 8704.0 | 8.5 |
EC | 当前Eden(伊甸园)区空间容量 | 157184.0 | 153.5 |
OGCMN | 初始老年代空间容量 | 349696.0 | 341.5 |
OGCMX | 最大老年代空间容量 | 349696.0 | 341.5 |
OGC | 当前老年代空间容量 | 349696.0 | 341.5 |
MCMN | 初始元空间容量 | 0.0 | 0 |
MCMX | 最大元空间容量 | 1136640.0 | 1,110 |
MC | 当前元空间容量 | 98280.0 | 95.9765625 |
CCSMN | 压缩的类空间初始容量 | 0.0 | 0 |
CCSMX | 压缩的类空间最大容量 | 1048576.0 | 1,024 |
CCSC | 当前压缩的类空间容量 | 11904.0 | 11.625 |
YGC | 新生代GC事件数量 | 46 | |
FGC | 完整GC事件数量 | 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
说明:
列代码 | 列名 | KB | MB | 备注 |
---|---|---|---|---|
S0C | 幸存者空间0容量 | 10240.0 | 10 | |
S1C | 幸存者空间1容量 | 10240.0 | 10 | |
S0U | 幸存者空间1利用率 | 2416.0 | 2.35 | |
S1U | 幸存者空间1利用率 | 0.0 | 0.0 | |
EC | Eden(伊甸园)空间容量 | 154112.0 | 150.5 | |
EU | Eden(伊甸园)空间利用率 | 123601.0 | 120.70 | |
OC | 老年代空间容量 | 349696.0 | 341.5 | |
OU | 老年代空间利用率 | 60088.0 | 58.67 | |
MC | 元空间容量 | 81112.0 | 79.21 | |
MU | 元空间利用率 | 75681.7 | 73.90 | |
CCSC | 压缩类空间容量 | 9432.0 | 9.21 | Compressed class space capacity,对应参数-XX:CompressedClassSpaceSize |
CCSU | 压缩类空间利用率 | 8462.0 | 8.26 | |
YGC | 新生代GC事件次数 | 38 | ||
YGCT | 新生代GC事件时间 | 1.640 | ||
FGC | Full GC事件次数 | 3 | ||
FGCT | Full GC事件时间 | 0.431 | ||
GCT | 总GC时间 | 2.071 |
jstat -gcutil
统计java进程的垃圾收集统计信息不限制采集次数,采集过程中尽量模拟一般情况下的系统调用情况,直到触发gc事件。
触发一次新生代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
触发一次完整GC事件Full GC
,如果空间过大,一般情况下无法人为触发,需要通过时间等待(项目启动时间除以FGC
可知多长时间触发一次Full GC),一般是1小时触发一次Full GC。
或许也可以让survivor
空间利用率接近100%触发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
# 查看java实例的某个参数
# 查看MetaspaceSize的值,默认是-XX:MetaspaceSize=21807104(20.79 MB)
jinfo -flag MetaspaceSize <jvmid>
# 查看MaxMetaspaceSize的值,默认是-XX:MaxMetaspaceSize=18446744073709547520(数值超过宿主机最大内存,视为无限或与宿主机一致)
jinfo -flag MaxMetaspaceSize <jvmid>
# 在docker容器外部(宿主机)终端
docker stats
# 查看某个docker容器的状态
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 | 容器通过其网络接口发送和接收的数据量 |
BLOCK I/O | 容器已从主机上的块设备读取和写入的数据量 |
PIDs | 容器创建的进程或线程数 |
I/O设备大致分为两类:块设备和字符设备。块设备将信息存储在固定大小的块中,每个块都有自己的地址。数据块的大小通常在512字节到32768字节之间。块设备的基本特征是每个块都能独立于其它块而读写。磁盘是最常见的块设备
基于结果第一条可知:
3.682GiB
,实际上就是宿主机的整个内存,相当于无限制。426.4MiB
,与11.31% * 3.682GiB
一致,实际上就是容器内java进程的实际内存使用大小(很接近),说明docker容器除了服务外没有多少额外内存消耗。已知当前老年代空间容量为341.5 MB
,再根据新生代GC和Full GC两种事件过程采集的结果可以计算出:
CCSC
往上推算最接近的1024整除数:1024/64=16 MB-Xmx
、-Xms
、-XX:MetaspaceSize
、-XX:MaxMetaspaceSize
Java8开始已经移除了永久代空间(PermGen或permanent generation)即-XX:PermSize
、-XX:MaxPermSize
两个参数是无效的。
取而代之的是元空间(metaspace):
-XX:MetaspaceSize
:最小元空间大小:并非初始化元空间大小,元空间一开始是0,并且不断扩增,直到MetaspaceSize,都不会触发Full GC,而一旦扩增超过MetaspaceSize后,每次扩增都会触发Full GC-XX:MaxMetaspaceSize
:最大元空间大小:扩增的上限,默认是无限,设置一个值,避免一个服务因错误地不断加载类而占用整个服务器的内存,从而影响其他服务的运行。修改项目镜像的Dockerfile
中java
命令的JVM参数
java \
-Xmx128m \
-Xms128m \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=256m \
......
并且重新构建镜像并运行。
Max memory = [-Xmx] + [-XX:MaxMetaspaceSize] + number_of_threads * [-Xss]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。