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.pswp.cn/news/371062.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371062.shtml
英文地址,請注明出處:http://en.pswp.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…