我们最近对生产系统的观察告诉我们Java容器的驻留内存使用量增长了.关于这个问题,我们已经做了一些调查,以了解为什么java进程使用像pmap这样的本机工具消耗比Heap + Thread Stacks + Shared Objects + Code Cache +等更多的内存.结果,我们发现了一些由本机进程分配的64M内存块(成对)(可能使用malloc/mmap):
0000000000400000 4K r-x-- /usr/java/jdk1.7.0_17/bin/java
0000000000600000 4K rw--- /usr/java/jdk1.7.0_17/bin/java
0000000001d39000 4108K rw--- [ anon ]
0000000710000000 96000K rw--- [ anon ]
0000000715dc0000 39104K ----- [ anon ]
00000007183f0000 127040K rw--- [ anon ]
0000000720000000 3670016K rw--- [ anon ]
00007fe930000000 62876K rw--- [ anon ]
00007fe933d67000 2660K ----- [ anon ]
00007fe934000000 20232K rw--- [ anon ]
00007fe9353c2000 45304K ----- [ anon ]
00007fe938000000 65512K rw--- [ anon ]
00007fe93bffa000 …Run Code Online (Sandbox Code Playgroud) 如果我通过创建缓冲区ByteBuffer.allocateDirect(),则内存存在于Java堆之外.有没有办法以跨平台的方式从我的应用程序中测量这种内存使用情况,类似于我如何使用Runtime.totalMemory()和测量Java堆使用情况Runtime.freeMemory()?
在 kubernetes 仪表板上,有一个 pod,其中内存使用情况(字节)显示为904.38Mi.
此 pod 包含使用-Xms512m -Xmx1024m, 和 kubernetes 部署文件 -> requests.memory = 512M,运行的 Java 应用程序limits.memory = 1.5G。
我已启用 gc 日志并在 pod 日志中看到这些:
[2020-04-29T15:41:32.051+0000] GC(1533) Phase 1: Mark live objects
[2020-04-29T15:41:32.133+0000] GC(1533) Phase 1: Mark live objects 81.782ms
[2020-04-29T15:41:32.133+0000] GC(1533) Phase 2: Compute new object addresses
[2020-04-29T15:41:32.145+0000] GC(1533) Phase 2: Compute new object addresses 11.235ms
[2020-04-29T15:41:32.145+0000] GC(1533) Phase 3: Adjust pointers
[2020-04-29T15:41:32.199+0000] GC(1533) Phase 3: Adjust pointers 54.559ms
[2020-04-29T15:41:32.199+0000] GC(1533) Phase 4: …Run Code Online (Sandbox Code Playgroud) java garbage-collection memory-management kubernetes kubernetes-metrics
我在春季启动中创建了一些服务,我有11个胖jar,并将它们部署在docker容器中,我的怀疑是每个jar都消耗了1到1.5 GB的RAM,而没有任何使用,我通过运行以下命令检查RAM:
docker stats containername
Run Code Online (Sandbox Code Playgroud)
起初我以为是Java容器,所以我尝试更改为使用alpine的容器,但没有任何变化,所以我认为唯一的问题是我的jar。有没有办法更改jar正在使用的RAM?还是这种行为是正常的,因为每个jar都有一个嵌入式的tomcat?或者将一些罐子放在一起作为战争来部署,并在一组“罐子”中仅使用一个tomcat更好?有人可以分享他/她的经验吗?,
提前致谢。