- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个在 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/
运行以下命令列出所有可用的 jvm 标志: jcmd 24468 VM.flags -all | less -N 然后在最后一列中,找到以下值(在 linux 上使用 JDK1.8): * produ
我尝试使用 jcmd 进行堆转储(从 git bash 控制台窗口): $ /c/Program\ Files/Java/jdk1.8.0_202/bin/jcmd 25156 GC.heap_d
为基于 JVM 的服务确定 docker 容器的尺寸是很棘手的(众所周知)。我很确定我们的容器尺寸略微不足,并且想澄清一些与我们在监控时看到的特定 jcmd( native 内存跟踪器)输出有关的问题
jcmd 实用程序提供多个诊断命令: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.
我在 Ubuntu Linux 机器上使用 Java1.8。使用以下命令创建线程转储: jcmd 1670 Thread.print > Thread.jfr 将文件复制到本地 MAC 机器并双击在
当我启动 jcmd 时,它会显示除 Jetty 之外的所有 java 进程,为什么? JCmd: [root@test_app_bm 2015_06_01_18_19_47_13098]# /usr/
我目前正在调查压缩类空间问题。我知道问题出在哪里,但在调查时,我注意到 jstat -gc ... 和 jcmd ... GC.heap_info 给出了不同数量的元空间和压缩类空间容量及用途: ▶
我正在尝试使用 jcmd VM.set_flag 选项进行试验。但是遇到一个错误,说“只能设置‘可写’标志”。什么是可写标志? 获取我的进程号: XXX@XXX-Air:~/javacode$ jcm
我有一个在 Docker 容器内的 Java 8 上运行的 Java 应用程序。该过程启动了一个 Jetty 9 服务器,并且正在部署一个 Web 应用程序。传递以下 JVM 选项:-Xms768m
当我运行jcmd PID help GC.heap_dump时,帮助清楚地表明将调用完整GC,除非指定-all标志: GC.heap_dump ... Impact: High: Depends on
在使用jcmd监控java进程时,有一个命令ManagementAgent.start。 检查手册页/oracle 文档/谷歌,没有找到任何描述。 问题是: 它的用途是什么? 最佳答案 此命令启动远程
jcmd 是一个很有前途的工具,可以重新组合 jmap、jsp 等实用程序... 你可以找到introduction和 man page但它仍然很轻。 在网络上,我发现显然存在的命令,如 GC.hea
我正在尝试使用以下 2 个命令进行堆转储 jcmd $pid GC.heap_dump/tmp/filename.dump jmap -dump:format=b,file=/tmp/filename
$ jcmd -l 418 sun.tools.jcmd.JCmd -l $ jstat -gcutil -t 10 250ms 1 10 not found 我知道 bug在
我想使用 java.lang.management.MemoryUsage 监视代码的堆使用情况。在下面的示例中,我在 HashSet 中创建了一堆条目,然后检查堆使用情况。我期望看到伊甸园空间的已用
我是一名优秀的程序员,十分优秀!