0

Я использую ActiveMQ 5.8.0 вместе с марионеточным mcollective 2.5.2, Java 1.8.0_31ActiveMQ высокое потребление памяти

И я столкнулся вопрос памяти в AciveMQ. Проблема в том, что ActiveMQ потребляет память, и после этого она не освобождается. Он продолжает расти, пока мы не перезапустим ActiveMQ. Я не знаю, в чем проблема с этим, может быть какая-то конфигурация отсутствует или настройки сбора мусора. Ниже приведены файлы конфигурации.

activemq.xml

<beans 
xmlns="http://www.springframework.org/schema/beans" 
xmlns:amq="http://activemq.apache.org/schema/core" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd 
http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd"> 

<!-- Allows us to use system properties as variables in this configuration file --> 
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>file:${activemq.base}/conf/credentials.properties</value> 
    </property> 
</bean> 

<!-- 
    The <broker> element is used to configure the ActiveMQ broker. 
--> 
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.base}/data" deleteAllMessagesOnStartup="true"> 

    <!-- 
     For better performances use VM cursor and small memory limit. 
     For more information, see: 

     http://activemq.apache.org/message-cursors.html 

     Also, if your producer is "hanging", it's probably due to producer 
     flow control. 

     For more information, see: 
     http://activemq.apache.org/producer-flow-control.html 
    --> 

    <destinationPolicy> 
     <policyMap> 
      <policyEntries> 
      <policyEntry topic=">" producerFlowControl="true" memoryLimit="100mb"> 
       <pendingSubscriberPolicy> 
       <vmCursor /> 
       </pendingSubscriberPolicy> 
      </policyEntry> 
      <policyEntry queue=">" producerFlowControl="true" memoryLimit="100mb" gcInactiveDestinations="true" inactiveTimoutBeforeGC="300000" > 
       <!-- 
       Use VM cursor for better latency 
       For more information, see: 

       http://activemq.apache.org/message-cursors.html 

       <pendingQueuePolicy> 
       <vmQueueCursor/> 
       </pendingQueuePolicy> 
       --> 
      </policyEntry> 
      </policyEntries> 
     </policyMap> 
    </destinationPolicy> 

    <!-- 
     The managementContext is used to configure how ActiveMQ is exposed in 
     JMX. By default, ActiveMQ uses the MBean server that is started by 
     the JVM. For more information, see: 

     http://activemq.apache.org/jmx.html 
    --> 
    <managementContext> 
     <managementContext createConnector="false"/> 
    </managementContext> 

    <!-- 
     Configure message persistence for the broker. The default persistence 
     mechanism is the KahaDB store (identified by the kahaDB tag). 
     For more information, see: 

     http://activemq.apache.org/persistence.html 
    --> 
    <persistenceAdapter> 
     <kahaDB directory="${activemq.base}/data/kahadb"/> 
    </persistenceAdapter> 

    <plugins> 
     <!-- 
     Enable the statisticsBrokerPlugin to allow ActiveMQ to collect 
     statistics. 
     --> 
     <statisticsBrokerPlugin/> 

     <!-- 
     Here we define a default set of users 
     --> 
     <simpleAuthenticationPlugin> 
     <users> 
      <authenticationUser username="mcollective" password="secret" groups="mcollective,admins,everyone"/> 
     </users> 
     </simpleAuthenticationPlugin> 
     <authorizationPlugin> 
     <map> 
      <authorizationMap> 
      <authorizationEntries> 
       <authorizationEntry queue=">" write="mcollective" read="mcollective" admin="mcollective" /> 
       <authorizationEntry topic=">" write="admins" read="admins" admin="admins" /> 
       <authorizationEntry topic="mcollective.>" write="mcollective" read="mcollective" admin="mcollective" /> 
       <authorizationEntry topic="mcollective.>" write="mcollective" read="mcollective" admin="mcollective" /> 
       <authorizationEntry topic="ActiveMQ.Advisory.>" read="everyone" write="everyone" admin="everyone"/> 
      </authorizationEntries> 
      </authorizationMap> 
     </map> 
     </authorizationPlugin> 
    </plugins> 


    <!-- 
     The systemUsage controls the maximum amount of space the broker will 
     use before slowing down producers. For more information, see: 

     http://activemq.apache.org/producer-flow-control.html 
    --> 
    <systemUsage> 
     <systemUsage> 
      <memoryUsage> 
       <memoryUsage limit="20 mb"/> 
      </memoryUsage> 
      <storeUsage> 
       <storeUsage limit="1 gb"/> 
      </storeUsage> 
      <tempUsage> 
       <tempUsage limit="100 mb"/> 
      </tempUsage> 
     </systemUsage> 
    </systemUsage> 

    <!-- 
     The transport connectors expose ActiveMQ over a given protocol to 
     clients and other brokers. For more information, see: 

     http://activemq.apache.org/configuring-transports.html 
    --> 
    <transportConnectors> 
     <transportConnector name="openwire" uri="tcp://0.0.0.0:6166"/> 
     <transportConnector name="stomp" uri="stomp://0.0.0.0:61613"/> 
    </transportConnectors> 

</broker> 

<!-- 
    Enable web consoles, REST and Ajax APIs and demos 
    It also includes Camel (with its web console), see ${ACTIVEMQ_HOME}/conf/camel.xml for more info 

    Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details 
--> 
<import resource="jetty.xml"/> 

ActiveMQ-wrapper.conf

wrapper.debug=FALSE 
set.default.ACTIVEMQ_HOME=/usr/share/activemq 
set.default.ACTIVEMQ_BASE=/usr/share/activemq 
set.default.ACTIVEMQ_CONF=/usr/share/activemq/conf 
wrapper.working.dir=/var/log/activemq 

# Java Application 
wrapper.java.command=java 

# Java Main class. This class must implement the WrapperListener interface 
# or guarantee that the WrapperManager class is initialized. Helper 
# classes are provided to do this for you. See the Integration section 
# of the documentation for details. 
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp 

# Java Classpath (include wrapper.jar) Add class path elements as 
# needed starting from 1 
wrapper.java.classpath.1=/usr/share/java/tanukiwrapper.jar 
wrapper.java.classpath.2=%ACTIVEMQ_HOME%/bin/activemq.jar 

# Uncomment to add mysql support 
#wrapper.java.classpath.3=/usr/share/java/mysql-connector-java.jar 

# Java Library Path (location of Wrapper.DLL or libwrapper.so) 
# Handle both 32bit and 64bit tanukiwrapper 
wrapper.java.library.path.1=/usr/lib 
wrapper.java.library.path.2=/usr/lib64 

# Java Additional Parameters 
# note that n is the parameter number starting from 1. 
wrapper.java.additional.1=-Dactivemq.home=%ACTIVEMQ_HOME% 
wrapper.java.additional.2=-Dactivemq.base=%ACTIVEMQ_BASE% 
wrapper.java.additional.3=-Dcom.sun.management.jmxremote 
wrapper.java.additional.4=-Dorg.apache.activemq.UseDedicatedTaskRunner=true 

# Example configuration for SSL 
#wrapper.java.additional.n=-Djavax.net.ssl.keyStorePassword=password 
#wrapper.java.additional.n=-Djavax.net.ssl.trustStorePassword=password 
#wrapper.java.additional.n=-Djavax.net.ssl.keyStore=%ACTIVEMQ_BASE%/conf/broker.ks 
#wrapper.java.additional.n=-Djavax.net.ssl.trustStore=%ACTIVEMQ_BASE%/conf/broker.ts 

#wrapper.java.additional.n=-Dderby.storage.fileSyncTransactionLog=true 

# Uncomment to enable jmx 
#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.port=1616 
#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.authenticate=false 
#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.ssl=false 

# Uncomment to enable YourKit profiling 
wrapper.java.additional.n=-Xrunyjpagent 

# Uncomment to enable remote debugging 
#wrapper.java.additional.n=-Xdebug -Xnoagent -Djava.compiler=NONE 
#wrapper.java.additional.n=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 

# Initial Java Heap Size (in MB) 
#wrapper.java.initmemory=3 

# Maximum Java Heap Size (in MB) 
#wrapper.java.maxmemory=512 
wrapper.java.maxmemory=4096 

# Application parameters. activemq.xml will be loaded from the config directory 
wrapper.app.parameter.1=org.apache.activemq.console.Main 
wrapper.app.parameter.2=start 
wrapper.app.parameter.3-xbean:activemq.xml 

#******************************************************************** 
# Wrapper Logging Properties 
#******************************************************************** 
# Format of output for the console. (See docs for formats) 
wrapper.console.format=PM 

# Log Level for console output. (See docs for log levels) 
wrapper.console.loglevel=INFO 

# Log file to use for wrapper output logging. 
wrapper.logfile=%ACTIVEMQ_BASE%/log/wrapper.log 

# Format of output for the log file. (See docs for formats) 
wrapper.logfile.format=LPTM 

# Log Level for log file output. (See docs for log levels) 
wrapper.logfile.loglevel=INFO 

# Maximum size that the log file will be allowed to grow to before 
# the log is rolled. Size is specified in bytes. The default value 
# of 0, disables log rolling. May abbreviate with the 'k' (kb) or 
# 'm' (mb) suffix. For example: 10m = 10 megabytes. 
wrapper.logfile.maxsize=10m 

# Maximum number of rolled log files which will be allowed before old 
# files are deleted. The default value of 0 implies no limit. 
wrapper.logfile.maxfiles=7 

# Log Level for sys/event log output. (See docs for log levels) 
wrapper.syslog.loglevel=NONE 

#******************************************************************** 
# Wrapper Windows Properties 
#******************************************************************** 
# Title to use when running as a console 
wrapper.console.title=ActiveMQ 

#******************************************************************** 
# Wrapper Windows NT/2000/XP Service Properties 
#******************************************************************** 
# WARNING - Do not modify any of these properties when an application 
# using this configuration file has been installed as a service. 
# Please uninstall the service before modifying this section. The 
# service can then be reinstalled. 

# Name of the service 
wrapper.ntservice.name=ActiveMQ 

# Display name of the service 
wrapper.ntservice.displayname=ActiveMQ 

# Description of the service 
wrapper.ntservice.description=ActiveMQ Broker 

# Service dependencies. Add dependencies as needed starting from 1 
wrapper.ntservice.dependency.1= 

# Mode in which the service is installed. AUTO_START or DEMAND_START 
wrapper.ntservice.starttype=AUTO_START 

# Allow the service to interact with the desktop. 
wrapper.ntservice.interactive=false 

Любой, пожалуйста, помогите. Спасибо.

+0

О какой памяти вы говорите? Heap? Является ли он еще высоким после цикла GC? –

+0

Это системная память. Он продолжает уменьшаться, пока мы не перезапустим ActiveMQ. –

+0

Уменьшите размер кучи, если хотите, чтобы он использовал меньше памяти. –

ответ

0

Это ничего особенного в ActiveMQ, но в значительной степени, как приложения Java могут behave. Тем не менее, он будет оставаться ниже максимального предела памяти, 4096 в вашей конфигурации. Ничто на самом деле не так. Со временем JVM может вернуть некоторую память в систему, если java-процесс (ActiveMQ в этом случае) остается низким в течение длительного периода времени. Точная механика может различаться между различными реализациями JVM и настройками. This article немного объясняет, но немного устарел.

См. Эту тему для более подробной информации о JVM и управлении памятью. java.exe process uses more memory and does not free it up

Если вы хотите визуализировать фактическое использование памяти (не память, выделенная для процесса Java), то я предлагаю вам подключиться к ActiveMQ виртуальной машины Java с помощью jvisualvm. Обычно это связано с JDK.

Смежные вопросы