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 Software博客上,从我们的JCG合作伙伴 Christian Posta 了解内存使用情况 。

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

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

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

相关文章

php设置排序,7种php基本排序实现方法

本文总结了一下常用的7种排序方法&#xff0c;并用php语言实现。1、直接插入排序/** 直接插入排序,插入排序的思想是&#xff1a;当前插入位置之前的元素有序&#xff0c;* 若插入当前位置的元素比有序元素最后一个元素大&#xff0c;则什么也不做&#xff0c;* 否则在有序序列…

170406、用uid分库,uname(用户名)上的查询怎么办

【缘起】 用户中心是几乎每一个公司必备的基础服务&#xff0c;用户注册、登录、信息查询与修改都离不开用户中心。 当数据量越来越大时&#xff0c;需要多用户中心进行水平切分。最常见的水平切分方式&#xff0c;按照uid取模分库&#xff1a; 通过uid取模&#xff0c;将数据分…

bzoj2144: 跳跳棋(二分/倍增)

思维好题&#xff01; 可以发现如果中间的点要跳到两边有两种情况&#xff0c;两边的点要跳到中间最多只有一种情况。 我们用一个节点表示一种状态&#xff0c;那么两边跳到中间的状态就是当前点的父亲&#xff0c;中间的点跳到两边的状态就是这个点的两个儿子&#xff0c;从而…

电脑投屏软件哪个好_目前当贝市场中投屏软件哪个好,最全面投屏技巧盘点

现在不管是在家里还是公司里&#xff0c;为了看一些是视频和资料&#xff0c;投屏到电视上是一件非常必要的事情&#xff0c;但是现在投屏的技巧各种各样&#xff0c;投屏的软件也是五花八门&#xff0c;小编平常也是经常投屏&#xff0c;也试过非常多的方法&#xff0c;这边分…

从零开始的全栈工程师——html篇1.2

起名方式与CSS 一.起名方式(起名方式也叫选择器) 起名的目的是为了给标签添加属性 常见的3种选择器有 标签选择器 id选择器(使用的时候加#) class选择器(使用的时候加.) 样式的要求是由选择器的权重来决定的 标签的权重为1 class的权重是10 id的权重是100 权重是可…

android开发中用到的px、dp、sp

先介绍一下这几个单位&#xff1a;px : pixels(像素),相应屏幕上的实际像素点。dip :device independent pixels&#xff0c;与密度无关的像素&#xff0c;基于屏幕密度的抽象单位。在每英寸160点的显示器上。 1dp 1px &#xff0c;即1 &#xff1a;1关系。&#xff08;dp 就是…

Spring:设置日志依赖项

这篇文章描述了如何在Spring中设置日志依赖。 它基于Dave Syer的帖子中提供的信息 。 这里提供有关Java日志记录框架的提醒。 该代码示例可在GitHub的Spring-Logging-Dependencies目录中找到。 Spring使用Jakarta Commons Logging API&#xff08;JCL&#xff09;。 不幸的是&…

【Codeforces Round #424 (Div. 2) C】Jury Marks

【Link】:http://codeforces.com/contest/831/problem/C 【Description】 有一个人参加一个比赛; 他一开始有一个初始分数x; 有k个评委要依次对这个人评分; 依照时间顺序依次给出这k个人的评分(可能为负数,负数的时候,表示分数会降低,而如果为正,则分数增加); 然后有一个…

php copy 文件夹,php删除与复制文件夹及其文件夹下所有文件的实现代码

/*复制xCopy函数用法&#xff1a;* xCopy("feiy","feiy2",1):拷贝feiy下的文件到 feiy2,包括子目录* xCopy("feiy","feiy2",0):拷贝feiy下的文件到 feiy2,不包括子目录*参数说明&#xff1a;* $source:源目录名* $destina…

安卓app开发工具_怎么开发app软件需要多少钱?主流app开发工具盘点

现在智能手机的快速普及让手机app在生活中越来越重要&#xff0c;很多企业及创业者也意识到了app的重要性&#xff0c;但是怎么开发app软件&#xff1f;有哪些主流app开发工具呢&#xff1f;这里就为大家分享一下如何快速开发app软件。一、编程app开发工具主要针对专业的程序员…

大话设计模式读书笔记(十一) 观察者模式

观察者模式&#xff1a; 书中通过小菜描述同事在公司看股票行情&#xff0c;并请求前台帮忙在老板回来时提醒同事&#xff0c;引出需求。将前台通知同事老板回来的事写成程序。未用模式实现&#xff1a; 1 //前台类2 public class Secretary {3 private List<StockObser…

解决高度塌陷

<!DOCTYPE html> <html lang"en" dir"ltr"><head><meta charset"utf-8"><title>高度塌陷解决</title><style media"screen">.box1{border: 10px #bfc993 solid;}.box2{width: 100px;height…

IBM AIX:Java进程大小监视

本文将为您提供有关如何计算在IBM AIX 5.3 OS上运行的Java VM进程的Java进程大小内存占用量的快速参考指南。 这是我关于该主题的原始文章的补充文章&#xff1a; 如何在AIX上监视Java本机内存 。 我强烈建议所有参与生产支持或AIX上部署Java应用程序开发的人员阅读此书。 为…

java 饥饿现象,Java单例模式、饥饿模式代码实例

class MyThreadScopeData {// 单例private MyThreadScopeData() {}// 提供获取实例方法public static synchronized MyThreadScopeData getThreadInstance() {// 从当前线程范围内数据集中获取实例对象MyThreadScopeData instance map.get();if (instance null) {instance n…

12. 抽象与密封

一、抽象类与抽象方法 1、抽象类与抽象方法声明&#xff1a; 抽象类&#xff1a;在面向对象的概念中&#xff0c;所有的类都是通过对象来描述&#xff0c;但并不是所有的类都用来描述对象。如果一个类中没有足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。  …

pstate0 vid数值意义_天体运动的简单数值计算

&#xff08;建议阅读全文&#xff09; 预备知识 万有引力&#xff0c; 弹簧振子受迫运动的简单数值计算    下面我们来用一种极其简单的算法对单个天体在中心天体的万有引力作用下的运动进行数值计算&#xff0e; 事实上该问题存在解析解&#xff08;见开普勒三定律&#x…

集合框架

集合框架包含的内容&#xff1a; 集合框架的接口&#xff1a; List接口实现类 ArrayList 1 package com.jredu.ch01;3 import java.util.ArrayList;5 import java.util.List;7 public class ArrayListTest {9 public static void main(String[] args) { 10 // TODO…

使用CSS实现无滚动条滚动

我们都知道&#xff0c;撸页面的时候当我们的内容超出了我们的div&#xff0c;往往会出现滚动条&#xff0c;影响美观。 尤其是当我们在做一些导航菜单的时候。滚动条一出现就破坏了UI效果。 我们不希望出现滚动条&#xff0c;也不希望超出去的内容被放逐&#xff0c;就要保留…

Java中的类型安全的空集合

我之前曾在Java Collections类的实用程序上进行过博客撰写&#xff0c;并且特别地在使用Usings Collections Methods上的博客emptyList&#xff08;&#xff09;&#xff0c;emptyMap&#xff08;&#xff09;和emptySet&#xff08;&#xff09;上进行了博客撰写。 在本文中&a…

php cpu mac,PHP 获得计算机的唯一标识[CPU,网卡 MAC地址]

//获取电脑的CPU信息function OnlyU(){$a ;$b array();if(function_exists(exec)){if(mailto:!exec( /all",$b)){return false;}}elseif(function_exists(system)){ob_start();if(mailto:!system( /all")){return false;}else{}$b ob_get_contents();ob_end_clean…