【问题标题】:activemq memory usage 4 times greater than Maximum heap allocatedactivemq 内存使用量是最大堆分配的 4 倍
【发布时间】:2017-09-04 21:38:58
【问题描述】:

我的 java actvemq 进程有以下配置,其中 Xmx 为 15360M 但是当我使用 Glance 看到内存的进程使用情况时,我看到 RSS 41.8gb 和 VSS 51.6GB。 pmap |grep total 给我总计 54059348K。一世 我不确定activemq中发生了什么导致这么多 正在使用的内存。虽然堆使用率非常低,直到 60%。

在 pmap 的输出中,我看到了很多匿名块。请找到随附的 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文件here

【问题讨论】:

  • 匿名块可以是线程堆栈。线程转储 (jstack) 可能会提供更多信息。我很想知道您为什么需要设置 Xmx=15Gb——这对于消息代理来说非常高。
  • 亲爱的 kevin 很高兴你回复了。当您在 RedHat 时,我们之前曾合作过。我们提供了 Xss 512k 来减少线程的堆栈大小。我提供了 15Gb 以确保 AMQ 拥有所需的所有堆,因为我们正在处理非常大量的数据。
  • 尝试通过 Xss 减少线程数 256K 添加 -Dorg.apache.activemq.UseDedicatedTaskRunner=FALSE 并设置 optimizedDispatch=true。这在启动时将线程数从 257 减少到 85,但即使在没有任何消息的情况下启动时,glance 命令仍显示 RSS 489mb 和 VSS 25gb。随着时间的推移,值会上升到 RSS 40gb 和 VSS 52gb,有 400 个线程并且没有设置 Xss。
  • 我仍然在 Red Hat ——我们正在关闭我们专有的公共论坛并转移到 StackOverflow。但是,如果您仍然可以的话,这看起来像是一个您应该提出支持票的问题。即使数据吞吐量很大,ActiveMQ 也不应该使用大量堆,除非您实际上正在处理非持久(内存中)消息。使用具有默认值 pre-fetch(通常为 1000)的大型(兆字节)消息将占用堆,以及导致大量线程产生的事情。这种情况确实需要详细分析堆和线程转储。
  • 不能再提高票证了。这里的问题是堆是正常的,但仍在消耗大量内存。

标签: java activemq heap-memory amq


【解决方案1】:

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

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

我对 pmap 不熟悉,所以我不能真正评论那部分,但想知道 top 命令给你的数字是多少?

【讨论】:

  • 这里我说的不是Java堆。 ActiveMQ 消耗的内存比配置的 Xmx 多,多线程企业 Java 应用程序消耗比配置的 Java Heap 更多的内存是很正常的。 ActiveMQ 不是纯 Java 解决方案,它使用大量 JNI 代码。
  • Torsten 对不起,我为幼稚的评论道歉,我将 JNI 客户端与 JNI 代码混淆了,但 Java 仍然会使用比分配的 Heap 更多的内存。它不是为了堆,而是为了我无法弄清楚的其他东西。堆始终保持在限制范围内,但 AMQ java 进程消耗的 RAM 空间仍然是分配的堆的 4 倍。 Top 和 ps 也显示出比实际分配的堆更多的内存使用量 4 倍。
【解决方案2】:

要分析应用程序的内存使用情况(不仅包括 Java Heap),您可以使用此answer

您的大多数匿名块的大小都很接近。在大多数情况下,很多匿名者都在谈论线程。如果您在 ActiveMQ 中有很多目的地,您可能有很多线程。但是你的匿名块的大小并不接近线程堆栈大小。所以它可能不是线程,我想。

请注意,15Gb 对于 ActiveMQ 非常高,有时对于 Java 也是如此,它可能会非常强烈地影响 GC。您可以阅读如何为系统内存使用配置 ActiveMQ herehere

【讨论】:

    【解决方案3】:

    我从您在 Unix 上运行的 RSS 的参考中得到它 - 不确定那是否是 Linux。

    我想知道您是否应该查看 PSS(比例集大小)而不是 RSS(驻留集大小) - 请参阅 this Unix & Linux Question on memory - 我发现 smem 是评估实际内存使用情况的好工具。

    例如 - 对于我服务器上的 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
    

    即pmap 给我的内存数字(3GB)比 smem PSS(实际上是 RSS)(~200M)高得多

    【讨论】:

    • 您好,我在 RHEL 上运行。我正在使用 HP 的 Glance 工具检查 RSS
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2012-12-06
    • 2023-03-03
    • 1970-01-01
    • 2012-02-13
    • 2017-08-29
    • 2023-03-20
    相关资源
    最近更新 更多