gpt4 book ai didi

Java 进程内存使用情况(jcmd 与 pmap)

转载 作者:IT王子 更新时间:2023-10-28 23:37:43 37 4
gpt4 key购买 nike

我有一个在 Docker 容器内的 Java 8 上运行的 Java 应用程序。该过程启动了一个 Jetty 9 服务器,并且正在部署一个 Web 应用程序。传递以下 JVM 选项:-Xms768m -Xmx768m.

最近注意到进程消耗大量内存:

$ ps aux 1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
app 1 0.1 48.9 5268992 2989492 ? Ssl Sep23 4:47 java -server ...

$ pmap -x 1
Address Kbytes RSS Dirty Mode Mapping
...
total kB 5280504 2994384 2980776

$ jcmd 1 VM.native_memory summary
1:

Native Memory Tracking:

Total: reserved=1378791KB, committed=1049931KB
- Java Heap (reserved=786432KB, committed=786432KB)
(mmap: reserved=786432KB, committed=786432KB)

- Class (reserved=220113KB, committed=101073KB)
(classes #17246)
(malloc=7121KB #25927)
(mmap: reserved=212992KB, committed=93952KB)

- Thread (reserved=47684KB, committed=47684KB)
(thread #47)
(stack: reserved=47288KB, committed=47288KB)
(malloc=150KB #236)
(arena=246KB #92)

- Code (reserved=257980KB, committed=48160KB)
(malloc=8380KB #11150)
(mmap: reserved=249600KB, committed=39780KB)

- GC (reserved=34513KB, committed=34513KB)
(malloc=5777KB #280)
(mmap: reserved=28736KB, committed=28736KB)

- Compiler (reserved=276KB, committed=276KB)
(malloc=146KB #398)
(arena=131KB #3)

- Internal (reserved=8247KB, committed=8247KB)
(malloc=8215KB #20172)
(mmap: reserved=32KB, committed=32KB)

- Symbol (reserved=19338KB, committed=19338KB)
(malloc=16805KB #184025)
(arena=2533KB #1)

- Native Memory Tracking (reserved=4019KB, committed=4019KB)
(malloc=186KB #2933)
(tracking overhead=3833KB)

- Arena Chunk (reserved=187KB, committed=187KB)
(malloc=187KB)

如您所见,RSS (2.8GB) 与虚拟机 native 内存统计数据实际显示的内容(提交 1.0GB,保留 1.3GB)之间存在巨大差异。

为什么会有这么大的差异?我知道 RSS 还显示了共享库的内存分配,但是在分析了 pmap 详细输出之后,我意识到这不是共享库的问题,而是被称为 [anon] 结构的东西消耗了内存.为什么JVM分配了这么多匿名内存块?

我正在搜索并发现以下主题: Why does a JVM report more committed memory than the linux process resident set size?但是,这里描述的情况有所不同,因为 RSS 显示的内存使用量少于 JVM 统计信息。我有相反的情况,无法弄清楚原因。

最佳答案

我的 Apache Spark 作业之一遇到了类似的问题,我们将应用程序作为胖 jar 提交,在分析线程转储后,我们认为 Hibernate 是罪魁祸首,我们过去常常在应用程序启动时加载 hibernate 类实际上是使用 java.util.zip.Inflater.inflateBytes 来读取 hibernate 类文件,这超出了我们的 native 常驻内存使用量几乎 1.5 GB,这是 hibernate 中针对此问题提出的错误 https://hibernate.atlassian.net/browse/HHH-10938?attachmentOrder=desc ,评论中建议的补丁对我们有用,希望这会有所帮助。

关于Java 进程内存使用情况(jcmd 与 pmap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39684464/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com