activemq内存使用量比分配的最大堆大4倍

时间:2017-09-04 21:38:59

标签: java activemq heap-memory amq

我的java actvemq进程配置如下,其中Xmx为15360M 但是当我看到内存的进程使用情况时,我看到了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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我从你在Unix上运行的RSS引用它 - 不确定那是不是Linux。

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

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


    public enum DAY {

    SUNDAY("sunday"),
    MONDAY("monday"),
    TUESDAY("tuesday"),
    UNKNOWN("unknown");

    private final String value;

    DAY(final String value) {
        this.value = value;
    }

    private static final Map<String, DAY> VALUE_TO_TYPE = new HashMap<>();

    static {
        Stream.of(DAY.values()).forEach(type -> VALUE_TO_TYPE.put(type.value, type));
    }

    public String value() {
        return value;
    }

    public static DAY fromValue(final String value) {
        final DAY day = VALUE_TO_TYPE.get(value);
        return day != null ?  day : UNKNOWN;
    }
}

即。 pmap给我一个比涂抹PSS(实际上是RSS)(~200M)更高的记忆力(3GB)

答案 2 :(得分:0)

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

你的大多数匿名版块的尺寸都很接近。在大多数情况下,很多人都谈论线程。如果你在ActiveMQ中有很多目的地,你可能会有很多线程。但是你的anon块的大小并不接近Thread Stack Size。我想,它可能不是线程。

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