相关疑难解决方法(0)

Java使用比堆大小更多的内存(或正确的Docker内存限制大小)

对于我的应用程序,Java进程使用的内存远远超过堆大小.

容器正在运行的系统开始出现内存问题,因为容器占用的内存比堆大小多得多.

堆大小设置为128 MB(-Xmx128m -Xms128m),而容器最多占用1 GB内存.在正常情况下,它需要500MB.如果docker容器具有以下限制(例如mem_limit=mem_limit=400MB),则该进程被OS的内存不足杀死所杀死.

你能解释为什么Java进程使用比堆更多的内存吗?如何正确调整Docker内存限制?有没有办法减少Java进程的堆外内存占用?


我使用JVM中的本机内存跟踪命令收集有关该问题的一些详细信息.

从主机系统,我获得容器使用的内存.

$ docker stats --no-stream 9afcb62a26c8
CONTAINER ID        NAME                                                                                        CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
9afcb62a26c8        xx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.0acbb46bb6fe3ae1b1c99aff3a6073bb7b7ecf85   0.93%               461MiB / 9.744GiB   4.62%               286MB / 7.92MB      157MB / 2.66GB      57
Run Code Online (Sandbox Code Playgroud)

从容器内部,我获得进程使用的内存.

$ ps -p 71 -o pcpu,rss,size,vsize
%CPU   RSS  SIZE    VSZ
11.2 486040 580860 3814600
Run Code Online (Sandbox Code Playgroud)
$ jcmd 71 VM.native_memory
71:

Native Memory Tracking:

Total: reserved=1631932KB, committed=367400KB
-                 Java Heap (reserved=131072KB, …
Run Code Online (Sandbox Code Playgroud)

java linux memory jvm docker

95
推荐指数
3
解决办法
1万
查看次数

鼓励JVM加入GC而不是增加堆?

(注意,当我说"JVM"时,我的意思是"Hotspot",我正在运行最新的Java 1.6更新.)

示例情况:

我的JVM在-Xmx设置为1gb的情况下运行.目前,堆已经分配了500mb,其中使用了450mb.该程序需要在堆上加载另外200 MB.目前,堆中有300mb的"可收集"垃圾(我们假设它们都是最老一代的.)

在正常操作下,JVM会将堆增长到700 MB左右,并在它到达时进行垃圾收集.

在这种情况下我想要的是JVM首先gc,然后分配新的东西,这样我们最终的堆大小保持在500mb,而使用的堆在350mb.

是否有JVM参数组合可以做到这一点?

java heap jvm jvm-hotspot jvm-arguments

19
推荐指数
3
解决办法
1万
查看次数

ZGC 最大堆大小超过物理内存

  1. JVM 选项是
-server -Xmx100g -Xms100g -XX:MaxMetaspaceSize=1G -Xss512k 
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -XX:MaxGCPauseMillis=30 
-XX:ConcGCThreads=4 -XX:ParallelGCThreads=12 
-XX:+DisableExplicitGC -XX:LargePageSizeInBytes=128m
Run Code Online (Sandbox Code Playgroud)
  1. 内存为256G
             total       used       free     shared    buffers     cached
Mem:           251        250          1        100          0        138
-/+ buffers/cache:        112        139
Swap:            7          0          7

Run Code Online (Sandbox Code Playgroud)
  1. top命令显示进程的RES是303G
   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                           
240731 xxx       20   0 17.0t 302g 297g S  6.6 119.9 256:35.43 java
Run Code Online (Sandbox Code Playgroud)
  1. jvm 配置文件显示如下
./jhsdb jmap --heap --pid 240731
Attaching to process ID 240731, please wait...
Debugger attached successfully.
Server compiler …
Run Code Online (Sandbox Code Playgroud)

java jvm-arguments

7
推荐指数
1
解决办法
1386
查看次数

标签 统计

java ×3

jvm ×2

jvm-arguments ×2

docker ×1

heap ×1

jvm-hotspot ×1

linux ×1

memory ×1