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 内存

activemq 内存_ActiveMQ:了解内存使用情况相关推荐

  1. activemq 内存_ActiveMQ中的温度,存储和内存使用百分比

    activemq 内存 为了有效使用ActiveMQ,了解ActiveMQ如何管理内存和磁盘资源以处理非持久性消息和持久性消息非常重要. ActiveMQ具有三个关键参数,需要对其进行检查. 临时使用 ...

  2. Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各 ...

  3. CentOS 7 查询CPU、内存、磁盘的使用情况

    本篇介绍记录一下CentOS 7 查询CPU型号.CPU核心.CPU详情.内存占用.磁盘使用情况 查看CPU型号 dmidecode -s processor-version (base) [root ...

  4. PYTHON通过psutil模块实时监测cpu、内存、网速运行情况

    PYTHON通过psutil模块实时监测cpu.内存.网速运行情况 运行多线程以后,随着设置更多的线程数,运行效率并没提升,一定是遇到了瓶颈,到底是CPU.内存还是网速到了上限?做了个实时监测,看看多 ...

  5. 诺顿 NIS2012杀毒软件 CPU、内存、磁盘IO占用情况测评

    测试平台 CPU:: I5 2410 内存: 金士顿 DDR3 1333 8G 硬盘:  日立 500G 7200转 测试程序 赛门铁克 诺顿 NIS2012 以下为全盘扫描的时候,NIS2012的C ...

  6. 使用JConsole监控进程、线程、内存、cpu、类情况

    Jconsole简介: Jconsole是一个JMX兼容的监视工具.它使用Java虚拟机的JMX机制来提供运行在Java平台的应用程序的性能与资源耗费信息. 监控进程使用方法如下: 由于JConsol ...

  7. JS 内存泄漏的几种情况以及解决方案

    内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存 并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了 ...

  8. JavaScript 中内存泄漏的几种情况

    内存泄露是什么 内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存 并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段 ...

  9. 【JavaScript】js中内存泄漏的几种情况?

    文章目录 一.是什么 二.垃圾回收机制 标记清除 引用计数 小结 三.常见内存泄露情况 参考文献 一.是什么 内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再 ...

最新文章

  1. Error(s) in loading state_dict
  2. Bootstrap 工具提示插件
  3. 应急照明市电检测_应急照明供电及接线(图析)
  4. restapi(0)- 平台数据维护,写在前面
  5. 如何将显示器连接到 Mac?
  6. 指向类对象的指针非空但是部分对象成员不存在原因分析
  7. java视频教程哪个好?
  8. mysql自定义序号_mysql序列号生成器 mysql自定义函数生成序列号的例子
  9. 【软件工程导论】期末复习重点
  10. 高分三号卫星以及数据产品简介
  11. Flutter 修改APP名称和logo
  12. delphi学习笔记(1)-object pascal语言的数据类型 选择自 xmz2629 的 Blog
  13. 一、《图解HTTP》了解Web和网络基础
  14. 密码模块安全等级 GM/T 0028
  15. wechat-0051,微信公众号,第三方登录—扫码绑定
  16. vue大屏展示高度自适应
  17. 【数据结构】两栈共享空间(双端栈)
  18. echarts markPoint 柱形图中添加图片
  19. scribd.com文档下载
  20. 计算机主机箱工作电流,计算机主板上所用到的电压标准

热门文章

  1. Java压缩技术(三) ZIP解压缩——Java原生实现
  2. Java 内存泄露总结
  3. [编程入门]阶乘求和:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
  4. 求从 1 到 100 之间所有奇数的平方和
  5. 不一样的假期,到底哪里不一样?
  6. 一份感动到哭的成绩单……
  7. oracle基本笔记整理及案例分析1
  8. 比特(bit)和字节(byte)(1byte=8bit)
  9. tomcat 实现 文件共享,查看文件目录
  10. linux container 原理,容器概念与Linux Container原理