activemq 内存_ActiveMQ:了解内存使用情况

activemq 内存

正如最近的一些邮件列表电子邮件和Google返回的许多信息所表明的那样,ActiveMQ的SystemUsage尤其是MemoryUsage功能使一些人感到困惑。 我将尝试解释有关MemoryUsage的一些细节,这些细节可能有助于理解它的工作方式。 我将不介绍StoreUsage和TempUsage,因为我的同事已经深入 介绍了这些内容 。

您可以使用activemq.xml配置的一部分来指定SystemUsage限制,特别是围绕代理可以使用的内存,持久性存储和临时存储。 这是ActiveMQ 5.7随附的默认值的示例:

<systemUsage><systemUsage><memoryUsage><memoryUsage limit="64 mb"/></memoryUsage><storeUsage><storeUsage limit="100 gb"/></storeUsage><tempUsage><tempUsage limit="50 gb"/></tempUsage></systemUsage>
</systemUsage>

内存使用情况

MemoryUsage似乎引起了最大的混乱,因此我在这里尝试阐明其内部工作原理。

当消息传入经纪人时,它必须走到某个地方。 它首先被解组断丝进入类型的ActiveMQ的命令对象ActiveMQMessage 。 目前,该对象显然已在内存中,但代理程序并未对其进行跟踪。

这将我们带到了第一点。

MemoryUsage实际上只是代理所需的字节数计数器,用于跟踪消息正在使用的JVM内存量。 这为经纪人提供了某种监视和确保我们不会超出极限的方法(稍后会详细介绍)。 否则,直到JVM用完堆空间之前,我们都可以在不知道限制的情况下接受消息。

因此,我们从线下传来了消息。 有了这些信息后,代理将查看消息需要路由到哪个目的地(或多个目的地)。 一旦找到目的地,它将“发送”到那里。 目的地将增加消息的引用计数(以稍后知道消息是否被视为“活动”)并继续对其进行处理。 对于第一个参考计数,内存使用量会增加。 对于最后的引用计数,内存使用量会减少。 如果目标是队列,它将把消息存储到一个持久位置,并尝试将其分发给使用者订阅。 如果是主题,它将尝试将其分发给所有订阅。 一路走来(从最初进入目的地到将消息发送给消费者的订阅),消息引用计数可以增加或减少。 只要它的引用计数大于或等于1,就会在内存中进行说明。

同样,MemoryUsage 只是一个对象,它对消息的字节进行计数,以了解已使用了多少JVM内存来保存消息。

所以,现在我们对这些的MemoryUsage是什么样一个基本的了解,让我们在一对夫妇的事情仔细看看:

  1. MemoryUsage层次结构(我可以在策略条目上配置的此目标内存限制是多少?)?
  2. 生产者流控制
  3. 在目标和订阅(生产者和消费者)之间分配内存使用情况?

主代理内存,目标内存,订阅内存

代理加载后,它将创建自己的SystemUsage对象(或使用配置中指定的对象)。 众所周知,SystemUsage对象具有与之关联的MemoryUsage,StoreUsage和TempUsage。 内存组件将称为代理的主内存。 它是一个使用对象,用于跟踪总体(目标,预订等)内存。

创建目的地后,目的地将创建自己的SystemUsage对象(它将创建自己的单独的Memory,Store和Temp Usage对象),但会将其父对象设置为代理的主SystemUsage对象。 目的地可以单独调整其内存限制(但不能调整存储和临时,它们仍将委派给父对象)。 设置目标的内存限制:

<destinationPolicy><policyMap><policyEntries><policyEntry queue=">" memoryLimit="5MB"/></policyEntries></policyMap>
</destinationPolicy>

因此,可以将目标使用情况对象用于更好地控制MemoryUsage,但对于所有使用情况计数,它始终与主内存协调。 此功能可用于限制目标保留的消息数量,以使单个目标不会饿死其他目标。 对于队列,它还会影响商店光标的高水位线。 队列对于持久性消息和非持久性消息具有不同的游标。 如果我们达到高水位线(目标内存限制的阈值),则不会再缓存任何邮件以准备发送,并且可以根据需要将非持久性消息清除到临时磁盘(如果
StoreCursor将使用FilePendingMessageCursor…否则,它将仅使用VMPendingMessageCursor而不会清除到临时存储)。

如果您没有为单个目标指定内存限制,则目标的SystemUsage将委派给所有使用计数的父级(Main SystemUsage)。 这意味着它将对所有与内存相关的计数有效地使用代理的Main SystemUsage。

另一方面,消费者订阅对自己的SystemUsage或MemoryUsage计数器没有任何概念。 他们将始终使用代理的Main SystemUsage对象。 关于此问题,要注意的主要事情是使用FilePendingMessageCursor进行订阅(例如,对于主题订阅)时,直到达到光标高水位标记(默认为70%)时,消息才会交换到磁盘上。这意味着将需要达到70%的主内存。 可能要花一会儿时间,并且很多消息都可以保留在内存中。 而且,如果您的订阅是保存大多数此类消息的订阅,则交换到磁盘可能需要一段时间。 当主题一次将消息分发给一个订阅时,如果一个订阅由于将消息交换到磁盘而停止,则准备接收消息的其余订阅也会感到速度变慢。

您可以将主题订阅的游标高水位线设置为低于默认值:

<destinationPolicy><policyMap><policyEntries><policyEntry topic="FOO.BAR.>" cursorMemoryHighWaterMark="30" /></policyEntries></policyMap>
</destinationPolicy>

对于感兴趣的人...当消息到达目标时,将在消息上设置MemoryUsage对象,以便当Message.incrementReferenceCount()可以增加内存使用量(第一次引用时)。 因此,这意味着它是由目标的内存使用情况(以及主内存)所引起的,因为目标的内存在使用情况发生变化时也会通知其父级,并且会继续这样做。 唯一会改变的是消息是否交换到磁盘上。 交换时,其引用计数将减少,其内存使用量将减少,并且一旦进入磁盘,它将丢失其MemoryUsage对象。 因此,当它恢复活力时,哪个MemoryUsage对象将与该对象相关联,并将在何处计数? 如果将其交换到队列的存储中,则在重组时,它将再次与目标内存使用量相关联。 如果已将其交换到预订中的临时存储中(例如在FilePendingMessageCursor中),则在重新构成时,它将不再与目标的内存使用量相关联。 它将与订阅的内存使用量(即主内存)相关联。

生产者流控制

跟踪消息使用的内存的最大胜利是生产者流控制(PFC) 。 PFC默认情况下处于启用状态,当达到使用限制时,基本上会减慢生产者的速度。 这可以防止代理超出其限制并耗尽资源。 对于同步发送的生产者或指定了生产者窗口的异步发送,如果达到系统使用率,则代理将阻止该单个生产者,但不会阻止连接。 取而代之的是它将消息暂时搁置以等待空间可用。 一旦消息被存储,它将仅发回ProducerAck。 在此之前,客户端应该阻止其发送操作(不会阻止连接本身)。 ActiveMQ 5.x客户端库可以为您处理此问题。 但是,如果在没有生产者窗口的情况下发送了异步发送,或者如果生产者行为不正常并且忽略了ProducerAcks,则PFC实际上会在到达内存时阻塞整个连接。 如果您的使用者共享同一连接,则可能导致死锁。

如果生产者流控制已关闭,则必须更加注意如何设置系统使用率。 当生产者流控制关闭时,它的基本含义是“经纪人,您必须接受传入的每条消息,无论消费者是否能跟上。” 这可用于处理到达目的地的传入消息的峰值。 如果您曾经看到日志中的内存使用严重超出了您设置的限制,则可能是PFC已关闭,这是预期的行为。

分割经纪人的主存

所以……我之前说过,目的地的内存使用代理的主内存作为父代,而订阅没有自己的内存计数器,它们仅使用代理的主内存。 嗯,这在默认情况下是正确的,但是如果找到原因,则可以进一步调整内存的划分和限制方式。 这里的想法是您可以将代理的主内存划分为“生产者”和“消费者”部分。

生产者部分将用于与进入代理的消息相关的所有事物,因此将在目的地中使用。 因此,这意味着,当一个目标上创建了自己的MemoryUsage,它将使用生产者内存作为其母公司,以及生产者的内存将使用代理的主存储器的一部分

另一方面,消费者部分将用于与向消费者分发消息有关的所有事情。 这意味着订阅。 与其直接使用代理的主内存进行预订,不如使用使用方内存(它将是主内存的一部分)进行订阅。 理想情况下,消费者部分和生产者部分将等于整个经纪人的主内存。

要在生产者和使用者之间分配内存,请在主<broker/>元素上设置splitSystemUsageForProducersConsumers属性:

<broker splitSystemUsageForProducersConsumers='true'>

默认情况下,这会将代理的主内存使用量分为生产者60%和消费者40%。 要进一步调整,请在主代理元素上设置producerSystemUsagePortionconsumerSystemUsagePortion

<broker splitSystemUsageForProducersConsumers='true' producerSystemUsagePortion='70' consumerSystemUsagePortion='30'>

你有它。 希望这可以为代理的MemoryUsage带来一些启发。

参考: ActiveMQ:通过Christian Posta软件博客的JCG合作伙伴 Christian Posta 了解内存使用情况 。

翻译自: https://www.javacodegeeks.com/2012/12/activemq-understanding-memory-usage.html

activemq 内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

osg动态加载模型不显示_OSG仿真案例(8)——读取FBX格式文件并显示(无动画)...

包含的头#include #include #include #include #include #include #include #include #include using namespace std;所需要的类(结构体)struct AnimationManagerFinder : public osg::NodeVisitor{osg::ref_ptr<:basicanimationmanager> _am;AnimationManagerFinder(){o…

用微服务和容器替换旧版Java EE应用程序服务器

Lightbend最近对2000多个JVM开发人员进行了调查&#xff0c;结果刚刚发布。 开展该调查的目的是发现&#xff1a;发展趋势与IT基础设施趋势之间的相关性&#xff0c;处于数字化转型前沿的组织如何使他们的应用程序现代化以及当今对新兴开发人员技术最为关注的实际生产使用情况细…

点分治经典_动态点分治

HYSBZ_3730_震波 背景&#xff1a;这是接触的动态点分治第一题&#xff0c;开始不是很理解&#xff0c;看了很久&#xff0c;写了很久才理解了动态的动态所在。前置知识&#xff1a;静态点分治&#xff08;主要是容斥思想&#xff0c;一般看出来是点分治的话&#xff0c;想到怎…

python settings模块导入不了_无法导入设置“myproject.settings”(是否在sys.path上?):没有名为pinax的模块...

我正试图让皮纳克斯在网络派系工作&#xff0c;有这么多的问题。。。[Sun Feb 19 20:01:20 2012] [error] [client 127.0.0.1] mod_wsgi (pid22796): Exception occurred processing WSGI script /home/pawesome/webapps/qtsocial/myproject.wsgi.[Sun Feb 19 20:01:20 2012] […

VS2012 颜色配置成黑色

效果展示&#xff1a; 步骤&#xff1a; 1、工具->选项->环境->常规->颜色体验 选为深色 2、在http://studiostyl.es/schemes/son-of-obsidian中&#xff0c;下载Son of Obsidian字体设置&#xff0c;然后 工具->导入和导出设置->导入选定的环境设置->…

@bzoj - 2388@ 旅行规划

目录 descriptionsolutionaccepted codedetailsdescription 请你维护一个序列&#xff0c;支持两种操作&#xff1a; &#xff08;1&#xff09;某个区间 [x, y] 内的数同时加上一个增量 k。 &#xff08;2&#xff09;询问某一个区间 [x, y] 中从 1 开始的最大前缀和。 input …

java与java ee_Java EE 7社区调查结果!

java与java ee在JSR 342下可以继续进行Java EE 7的工作。一切都在顺利进行&#xff0c;Java EE 7现在处于早期草稿审查阶段。 在11月初&#xff0c; Oracle发布了一个有关即将推出的Java EE 7功能的小型社区调查 。 昨天结果公布了。 超过1,100名开发人员参加了调查&#xff0…

浅谈C++中内存分配、函数调用和返回值问题

在谈述函数调用和返回值问题之前&#xff0c;先来看看C中内存分配的问题。 C编译器将计算机内存分为代码区和数据区&#xff0c;很显然&#xff0c;代码区就是存放程序代码&#xff0c;而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区…

dataguard从库数据库丢失恢复例子(模拟所有的控制文件)

1.退出日志应用模式[oraclelocalhost ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on Mon Jan 14 16:09:16 2019 Copyright (c) 1982, 2013, Oracle. All rights reserved. SQL> connect / as sysdbaConnected.SQL> alter database recover managed sta…

python教程自带数据库_python教程自带数据库 | Python学哪个数据库

python使用数据库增条数据import pymysql#返回Connection#host"localhost"con pymysql.connect(host"192.168.31.28",port3306,user"atguigu",password"atguigu",db"atguigudb",charset"utf8")#返回cursor对象cu…

Java SE 8新功能介绍:使用新的DateTime API计算时间跨度

使用Java SE 8新的DateTime API JSR 310…可以实现更清晰&#xff0c;可读且功能强大的编码。 Java SE 8&#xff0c;JSR 310 在上一篇文章“ 使用Streams API处理集合 ”中&#xff1b; 我已深入探讨和探索如何使用流遍历集合&#xff0c;如何从集合和数组创建流以及最终汇总…

使用VS2012内建的C++测试架构进行单元测试

前言 在软件开发的过程中&#xff0c;单元测试(Unit testing)是一个重要的coding步骤&#xff0c;可以让你的程序代码质量大幅提升、协助你进行良好的程序架构设计&#xff0c;单元测试是针对程序单元(软件设计的最小单位)来进行正确性检验的测试工作&#xff0c;在程序化编程中…

【博 客 文 章】

1、C#中的Explicit和Implicit转载于:https://www.cnblogs.com/kikyoqiang/p/10270416.html

sql intersect mysql_SQL INTERSECT子句

SQL INTERSECT子句/操作符用于合并两个SELECT语句&#xff0c;但只从第一个SELECT语句返回完全相同于第二个SELECT语句结果的所有行。这意味着INTERSECT是由两个SELECT语句返回相同的行(唯一)。正如使用UNION操作&#xff0c;同样的规则可使用在INTERSECT运算符。 但MySQL不支持…

vs2010下release版本调试设置

设置在Release模式下调试的方法&#xff1a; 1.工程项目上右键 -> 属性 2.c -> 常规 -〉调试信息格式 选 程序数据库(/Zi)或(/ZI), 注意&#xff1a;如果是库的话&#xff0c;只能(Zi) 3.c -> 优化 -〉优化 选 禁止&#xff08;/Od&#xff09; 4.连接…

控制反转 java_控制反转( Ioc)快速入门

2.1 什么是控制反转(IOC&#xff1a;Inverse of Control)IOC反转控制&#xff0c;实际上就是将对象的创建权交给了Spring&#xff0c;程序员无需自己手动实例化对象。可以看出来工厂的作用就是用来解耦合的&#xff0c;而在使用spring的过程中&#xff0c;spring就是充当这个工…

spring 工作流引擎_带Spring的简单工作流引擎

spring 工作流引擎几个月前&#xff0c;在处理一个公司项目时&#xff0c;我们需要开发REST服务&#xff0c;该服务用于根据客户端应用程序发送的数据发送电子邮件。 在开发此服务期间&#xff0c;我们决定创建简单的工作流引擎&#xff0c;该引擎将为发送电子邮件收费&#xf…

如何成为一个牛逼的C/C++程序员? (仔细阅读)

这个题目的噱头太大&#xff0c;要真的写起来&#xff0c; 足够写一本书了。 本人是过来人&#xff0c; 结合自身的体会和大家交流一下&#xff0c;希望新人能少走弯路。 每个人的情况不一样&#xff0c;我下面的描述可能并不适合每一个看到这篇文章的人。 一、C/C语言 如果你的…

java 两个字段排序,如何在Java中按两个字段排序?

I have array of objects person (int age; String name;).How can I sort this array alphabetically by name and then by age?Which algorithm would you use for this ?解决方案You can use Collections.sort as follows:private static void order(List persons) {Colle…

数据结构java语言描述朱战立_数据结构——树(Java语言描述)

树根:rootNode. 树只有一个树根。节点:Node. 树上的所有节点。子节点数组:Node[]. 数组代表每个节点的所有子节点父节点:parentNode. 每个节点只有一个父节点。2. Node为Tree中的内部类parent &#xff1a;指向父节点的引用childern: 孩子数组&#xff0c;存储该节点的所有子节…