当前位置: 首页 > 知识库问答 >
问题:

activemq内存使用率是分配的最大堆的4倍

阎懿轩
2023-03-14

我的java actvemq进程的配置如下,其中Xmx为15360M,但当我使用glance查看进程内存使用情况时,我看到RSS 41.8gb和VSS 51.6gb。pmap | grep total给了我总计54059348K。我不确定activemq中发生了什么,导致占用了这么多内存。而堆使用率很低,只有60%。

在pmap的输出中,我看到了许多anon块。请查看随附的PMAP输出

/XXXXX 111922      1 22 14:30 pts/0    00:04:26 
/u/users/user/jdk1.7.0_71/bin/java -Xms1024M -Xmx15360M -Xss512K 
-XX:+UseG1GC -XX:NewRatio=4 -XX:InitiatingHeapOccupancyPercent=45 
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/x/logs/AMQGC.log 
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=20M 
-Djava.util.logging.config.file=logging.properties 
-Djava.security.auth.login.config=/u/users/user/POSInterfaces/apache-activemq-5.13.2//conf/login.config 
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote 
-Djava.awt.headless=true 
-Djava.io.tmpdir=/u/users/user/POSInterfaces/apache-activemq-5.13.2//tmp 
-Dactivemq.classpath=/u/users/user/POSInterfaces/apache-activemq-5.13.2//conf:/u/users/user/POSInterfaces/apache-activemq-5.13.2//../lib/: 
-Dactivemq.home=/u/users/user/POSInterfaces/apache-activemq-5.13.2/ 
-Dactivemq.base=/u/users/user/POSInterfaces/apache-activemq-5.13.2/ 
-Dactivemq.conf=/u/users/user/POSInterfaces/apache-activemq-5.13.2//conf 
-Dactivemq.data=/u/users/user/POSInterfaces/apache-activemq-5.13.2//data 
-jar /u/users/user/POSInterfaces/apache-activemq-5.13.2//bin/activemq.jar 
start/ 

请在此处找到pmap文件

共有3个答案

邓俊英
2023-03-14

我从RSS中得知你在Unix上运行-不确定这是否Linux。

我想知道您是否应该关注PSS(比例集大小)而不是RSS(常驻集大小)-请看这个Unix

例如-对于我的服务器上的ActiveMQ进程(设置为-Xmx512m)

[user@vm ~]$ sudo pmap 13727 | grep total
 total          3161064K

[user@vm ~]$ sudo smem | grep -e '13727' -e 'PSS'
  PID User     Command                         Swap      USS      PSS      RSS
13727 activemq /usr/bin/java -Xms64M -Xmx1        0   212604   214962   229468

i、 e.pmap给了我比smem PSS(实际上是RSS)更高的内存数字(3GB)(约200M)

晋功
2023-03-14

要分析应用程序的内存使用情况(不仅包括Java堆),可以使用这个答案。

你的大多数anon区块大小相近。在大多数情况下,很多人都在谈论线程。如果在ActiveMQ中有很多目的地,那么可以有很多线程。但anon块的大小与线程堆栈的大小并不接近。所以我想它可能不是线程。

请注意,15Gb对于ActiveMQ来说非常高,有时对于Java来说也是如此,它可能会对GC产生非常大的影响。您可以在此处和此处阅读如何配置ActiveMQ以供系统内存使用。

戴品
2023-03-14

我可以确认,ActiveMQ无法使用比您使用-Xmx配置的JVM堆更多的JVM堆。ActiveMQ是100%Java,因此代理不会使用JVM以外的堆内存。

要了解实际使用了多少Java堆,请查询JVM的JMX统计信息,它应该始终保持在配置的限制内。

我不熟悉pmap,所以我不能真正评论这一部分,但我想知道最高司令部给了你什么数字?

 类似资料:
  • 我有一个占用内存的java服务器任务。首先,我怀疑它是否超过了MinHeapFreeRatio,但这只是猜测。更有趣的是,GC将成熟代减少到大约2%,但从未减少为堆分配的内存。

  • 在图像中,使用内存为3.8G,提交内存为8.6G,最大内存也为8.6G,任何人都可以解释使用内存和提交内存之间的差异,或者任何解释它的链接。

  • 我使用5.6.21-70.0进行性能测试。 当我跑步时 mysqlslp-a--并发=40--查询次数1000次--迭代=500次--引擎=innodb--debug-info-utest-p 做一些性能测试,ram增长超过最大内存使用量,永不释放 当完成mysqlslap时,内存显示使用78% 我有1G物理内存,不使用交换 KiB Mem:总共1016656个,使用953808个,免费62848

  • 如果没有在OSX捆绑包上指定,Java7如何决定分配的堆内存的最大值(-Xmx),我已经阅读了手册页,它没有给出任何指示。它似乎被分配比默认Java6和我想知道它是否随可用存储器的机器上这将是非常有用的我因为我的应用程序是内存绑定但我不能设置默认太高,因为这样应用程序将无法在较低规格的机器上运行。

  • 4. 分配内存的函数 除了malloc之外,C标准库还提供了另外两个在堆空间分配内存的函数,它们分配的内存同样由free释放。 #include <stdlib.h> void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); 返回值:成功返回所分配内存空间的首地址,出错返回NULL calloc

  • 对于堆排序,如果我们想按升序对数组排序,那么应该在最大堆还是最小堆中转换堆?