聊聊flink的MemoryPool

為什么80%的碼農都做不了架構師?>>> ??hot3.png

本文主要研究一下flink的MemoryPool

MemoryPool

flink-runtime_2.11-1.7.2-sources.jar!/org/apache/flink/runtime/memory/MemoryManager.java

	abstract static class MemoryPool {abstract int getNumberOfAvailableMemorySegments();abstract MemorySegment allocateNewSegment(Object owner);abstract MemorySegment requestSegmentFromPool(Object owner);abstract void returnSegmentToPool(MemorySegment segment);abstract void clear();}
  • MemoryPool定義了getNumberOfAvailableMemorySegments、allocateNewSegment、requestSegmentFromPool、returnSegmentToPool、clear這幾個抽象方法;它有HybridHeapMemoryPool、HybridOffHeapMemoryPool這兩個子類

HybridHeapMemoryPool

flink-runtime_2.11-1.7.2-sources.jar!/org/apache/flink/runtime/memory/MemoryManager.java

	static final class HybridHeapMemoryPool extends MemoryPool {/** The collection of available memory segments. */private final ArrayDeque<byte[]> availableMemory;private final int segmentSize;HybridHeapMemoryPool(int numInitialSegments, int segmentSize) {this.availableMemory = new ArrayDeque<>(numInitialSegments);this.segmentSize = segmentSize;for (int i = 0; i < numInitialSegments; i++) {this.availableMemory.add(new byte[segmentSize]);}}@OverrideMemorySegment allocateNewSegment(Object owner) {return MemorySegmentFactory.allocateUnpooledSegment(segmentSize, owner);}@OverrideMemorySegment requestSegmentFromPool(Object owner) {byte[] buf = availableMemory.remove();return  MemorySegmentFactory.wrapPooledHeapMemory(buf, owner);}@Overridevoid returnSegmentToPool(MemorySegment segment) {if (segment.getClass() == HybridMemorySegment.class) {HybridMemorySegment heapSegment = (HybridMemorySegment) segment;availableMemory.add(heapSegment.getArray());heapSegment.free();}else {throw new IllegalArgumentException("Memory segment is not a " + HybridMemorySegment.class.getSimpleName());}}@Overrideprotected int getNumberOfAvailableMemorySegments() {return availableMemory.size();}@Overridevoid clear() {availableMemory.clear();}}
  • HybridHeapMemoryPool繼承了MemoryPool,它使用的是jvm的heap內存;構造器接收numInitialSegments、segmentSize兩個參數用于初始化availableMemory這個ArrayDeque,該queue的元素類型為byte[]
  • allocateNewSegment方法調用的是MemorySegmentFactory.allocateUnpooledSegment,用于分配unpooled memory;requestSegmentFromPool方法調用的是availableMemory.remove(),然后調用MemorySegmentFactory.wrapPooledHeapMemory包裝為MemorySegment,這個方法沒有判斷ArrayDeque的大小就直接remove,需要注意
  • returnSegmentToPool方法只對HybridMemorySegment類型進行處理,首先將它的byte[]歸還到availableMemory,之后調用heapSegment.free()釋放;getNumberOfAvailableMemorySegments方法返回的是availableMemory.size();clear方法調用的是availableMemory.clear()

HybridOffHeapMemoryPool

flink-runtime_2.11-1.7.2-sources.jar!/org/apache/flink/runtime/memory/MemoryManager.java

	static final class HybridOffHeapMemoryPool extends MemoryPool {/** The collection of available memory segments. */private final ArrayDeque<ByteBuffer> availableMemory;private final int segmentSize;HybridOffHeapMemoryPool(int numInitialSegments, int segmentSize) {this.availableMemory = new ArrayDeque<>(numInitialSegments);this.segmentSize = segmentSize;for (int i = 0; i < numInitialSegments; i++) {this.availableMemory.add(ByteBuffer.allocateDirect(segmentSize));}}@OverrideMemorySegment allocateNewSegment(Object owner) {return MemorySegmentFactory.allocateUnpooledOffHeapMemory(segmentSize, owner);}@OverrideMemorySegment requestSegmentFromPool(Object owner) {ByteBuffer buf = availableMemory.remove();return MemorySegmentFactory.wrapPooledOffHeapMemory(buf, owner);}@Overridevoid returnSegmentToPool(MemorySegment segment) {if (segment.getClass() == HybridMemorySegment.class) {HybridMemorySegment hybridSegment = (HybridMemorySegment) segment;ByteBuffer buf = hybridSegment.getOffHeapBuffer();availableMemory.add(buf);hybridSegment.free();}else {throw new IllegalArgumentException("Memory segment is not a " + HybridMemorySegment.class.getSimpleName());}}@Overrideprotected int getNumberOfAvailableMemorySegments() {return availableMemory.size();}@Overridevoid clear() {availableMemory.clear();}}
  • HybridOffHeapMemoryPool繼承了MemoryPool,它使用的是OffHeap;構造器接收numInitialSegments、segmentSize兩個參數用于初始化availableMemory這個ArrayDeque,該queue的元素類型為ByteBuffer
  • allocateNewSegment方法調用的是MemorySegmentFactory.allocateUnpooledOffHeapMemory,用于分配unpooled off-heap memory;requestSegmentFromPool方法調用的是availableMemory.remove(),然后調用MemorySegmentFactory.wrapPooledOffHeapMemory包裝為MemorySegment,這個方法沒有判斷ArrayDeque的大小就直接remove,需要注意
  • returnSegmentToPool方法只對HybridMemorySegment類型進行處理,首先將它的ByteBuffer歸還到availableMemory,之后調用heapSegment.free()釋放;getNumberOfAvailableMemorySegments方法返回的是availableMemory.size();clear方法調用的是availableMemory.clear()

小結

  • MemoryPool定義了getNumberOfAvailableMemorySegments、allocateNewSegment、requestSegmentFromPool、returnSegmentToPool、clear這幾個抽象方法;它有HybridHeapMemoryPool、HybridOffHeapMemoryPool這兩個子類
  • HybridHeapMemoryPool繼承了MemoryPool,它使用的是jvm的heap內存;構造器接收numInitialSegments、segmentSize兩個參數用于初始化availableMemory這個ArrayDeque,該queue的元素類型為byte[];allocateNewSegment方法調用的是MemorySegmentFactory.allocateUnpooledSegment,用于分配unpooled memory;requestSegmentFromPool方法調用的是availableMemory.remove(),然后調用MemorySegmentFactory.wrapPooledHeapMemory包裝為MemorySegment,這個方法沒有判斷ArrayDeque的大小就直接remove,需要注意;returnSegmentToPool方法只對HybridMemorySegment類型進行處理,首先將它的byte[]歸還到availableMemory,之后調用heapSegment.free()釋放;getNumberOfAvailableMemorySegments方法返回的是availableMemory.size();clear方法調用的是availableMemory.clear()
  • HybridOffHeapMemoryPool繼承了MemoryPool,它使用的是OffHeap;構造器接收numInitialSegments、segmentSize兩個參數用于初始化availableMemory這個ArrayDeque,該queue的元素類型為ByteBuffer;allocateNewSegment方法調用的是MemorySegmentFactory.allocateUnpooledOffHeapMemory,用于分配unpooled off-heap memory;requestSegmentFromPool方法調用的是availableMemory.remove(),然后調用MemorySegmentFactory.wrapPooledOffHeapMemory包裝為MemorySegment,這個方法沒有判斷ArrayDeque的大小就直接remove,需要注意;returnSegmentToPool方法只對HybridMemorySegment類型進行處理,首先將它的ByteBuffer歸還到availableMemory,之后調用heapSegment.free()釋放;getNumberOfAvailableMemorySegments方法返回的是availableMemory.size();clear方法調用的是availableMemory.clear()

doc

  • MemoryManager

轉載于:https://my.oschina.net/go4it/blog/3012871

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252301.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

day4

ti很簡單&#xff0c;但是把變量弄錯了&#xff0c;寫了不到半小時&#xff0c;調了一小時&#xff0c;導致t3功虧一簣。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> …

C++中public protected private的區別

1. 不考慮繼承關系時 本類方法使用外部使用private是否protected是否public是是 2. 有繼承關系時 子類方法使用外部private否否protected是否public是是 結論&#xff1a;基于以上兩個表格可以知道&#xff0c;C中的protected處于private和public中間&#xff0c; protected 既…

表達式求值

表達式求值問題 ①問題描述 表達式是數據運算的基本形式。人們的書寫習慣是中綴式&#xff0c;如&#xff1a;1122*(7-4)/3。中綴式的計算按運算符的優先級及括號優先的原則&#xff0c;相同級別從左到右進行計算。表達式還有后綴式&#xff08;如&#xff1a;22 7 4 - * 3 / 1…

PHP_SELF變量解析和重復路徑解決

最近升級PHP到PHP7版本&#xff0c;并重新部署了新的Nginx&#xff0c;啟動的時候發現了一個問題&#xff0c;全局變量$_SERVER[PHP_SELF]的值發生了改變&#xff0c;從而影響到代碼的功能。因此我們來了解下$_SERVER全局變量中的PHP_SELF/PATH_INFO/SCRIPT_NAME等參數以及其關…

pep 8 規范的一些記錄

一、pep8起源 龜叔創立Python的初衷里就有創立一個容易閱讀的編程語言&#xff0c;所以親自操刀寫了pep8 代碼規范&#xff0c;每個項目開始前都要有一個共識&#xff0c;就是自己的代碼規范&#xff0c;pep8 就是一個很好的范本。 二、官網鏈接 https://www.python.org/dev/pe…

C++中的類加多線程代碼修煉之二

背景&#xff1a;在上一篇文章中 寫到了我第一次使用C使用多個類多個線程進行編程&#xff0c;由于是第一接手“這么大一個工程”&#xff0c;所以還是要有個參照物的&#xff0c;由于我呢之前好幾年一直在看的一個C代碼工程就是ORB-SLAM了&#xff0c;這個工程使用C語言&#…

Primer c++ 第5版pdf

下載地址&#xff1a;網盤下載 內容簡介 這本久負盛名的 C經典教程&#xff0c;時隔八年之久&#xff0c;終迎來史無前例的重大升級。除令全球無數程序員從中受益&#xff0c;甚至為之迷醉的——C 大師 Stanley B. Lippman 的豐富實踐經驗&#xff0c;C標準委員會原負責…

eclispe修改project Explorer字體大小

切換到Eclipse目錄下: D:\JAVA\spring-tool-suite\sts-4.0.2.RELEASE\plugins\org.eclipse.ui.themes_1.2.200.v20180828-1350 找到下面的這個css文件 打開找到下面的位置在下面添加代碼:CTabFolder Tree{font-size: 15px;} 復制代碼重啟Eclipse,就可以看到效果 修改前 修改后…

3-4 第三天 Generator生成器

Generator是ES6里面的新增規范&#xff0c;ES6其實就是ES2015。ES5、ES6、ES7這些術語大家上網一查就都明白了。JavaScript是一個范程&#xff0c;就是我們說的JS。ES就是ECMA Script&#xff0c;是JavaScript標準的書面說法。ES4、5、6、7其實是JS這門語言發展中的不同的版本。…

神奇的事情--長見識了

背景&#xff1a;我的這個工程里有多個命名空間&#xff0c;之所以是這樣是因為&#xff0c;有一個跟蹤算法他本身有幾個namespace,然后我在他的基礎上進行整合代碼&#xff0c;將其作為一個功能接口&#xff0c;供其他函數調用&#xff0c;我在整合代碼時&#xff0c;將我新加…

箭頭函數的使用用法(一)

1 //箭頭函數的一個好處是簡化回調函數2 //箭頭函數沒有參數&#xff0c;就使用圓刮號代表參數部分&#xff1b;3 var f () >5;4 console.log(f());5 //兩個參數的情況&#xff0c;代碼塊只有一條語句&#xff0c;可以省略{}6 var f (a,b)> console.log(ab);7 f(1,3);8…

LinkedList中查詢(contains)和刪除(remove)源碼分析

一、contains源碼分析 本文分析雙向鏈表LinkedList的查詢操作源碼實現。jdk中源程序中&#xff0c;LinkedList的查詢操作&#xff0c;通過contains(Object o)函數實現。具體見下面兩部分程序&#xff1a;① public boolean contains(Object o) {return indexOf(o) ! -1; } ② p…

分塊入門

我貌似和所有的數據結構都有些誤會。。。。。。 在處理一些修改查詢問題的時候&#xff0c;我們可以利用分治的思想&#xff0c;比如說把一個線性的數據不斷分成一棵二叉樹&#xff0c;也就是我們所說的線段樹&#xff0c;這樣我們就可以在logn的時限里做到修改和查詢。同理我們…

開始使用gitlab

不得不說&#xff0c;我真不是一個合格的程序猿&#xff0c;工作馬上兩年了&#xff0c;github和gitlab用的一點也不熟練&#xff0c;每次興致來了就搞幾下&#xff0c;可是每次都淺嘗輒止&#xff0c;不求甚解&#xff0c;時間一長&#xff0c;上一次練習的步驟就都記不起來了…

Spark 2.2.0 文檔中文版 Collaborative Filtering 協同過濾 JAVA推薦系統

協同過濾常用于推薦系統&#xff0c;這項技術旨在填補 丟失的user-item關聯矩陣 的條目&#xff0c;spark.ml目前支持基于模型的協同過濾&#xff08;用一些丟失條目的潛在因素在描述用戶和產品&#xff09;。spark.ml使用ALS&#xff08;交替最小二乘法&#xff09;去學習這些…

淘寶top平臺調用接口響應時間優化

我的專欄地址&#xff1a;我的segmentfault,歡迎瀏覽 一、背景 調用top接口的響應時間長&#xff08;160ms左右&#xff09;&#xff0c;超時和連接異常頻繁發生。導致消息組件消費工程的tps遇到瓶頸&#xff08;單實例單消息隊列250tps&#xff09;&#xff0c;只能通過增加實…

樹上倍增一些理解和寫法

樹上倍增可以比較容易求得i節點的第k個父親&#xff0c;我們定義一個二維數組fa[i][j]代表節點i的第2^j個父親&#xff0c;關于有什么用我們等會再說&#xff0c;現在先學會怎么去求這個fa數組 我們可以通過從根節點開始一遍dfs求得所有fa數組&#xff0c;首先我們發現fa數組有…

圖像去畸變和添加畸變

背景&#xff1a;最近的項目中用到的圖像去畸變的知識&#xff0c;剛開始是直接調用opencv中提供的函數cv::initUndistortRectifyMap()和cv::remap()函數&#xff0c;實現圖像的全局去畸變&#xff0c;但是由于圖像的分辨率很高&#xff0c;再加上&#xff0c;實際過程中我們只…

win10上編譯libharu庫

背景&#xff1a; 最近的項目需要自動的生成pdf文件&#xff0c;我在網上查看相關的資料&#xff0c;發現目前比較流行的生成pdf文件的庫有兩個&#xff0c;一個是libpdf&#xff0c;另一個是libharu。libpdf個人使用時免費的但是商業使用就需要收費了&#xff0c;否則得到的p…

爬蟲——正則表達式re模塊

為什么要學習正則表達式 實際上爬蟲一共就四個主要步驟&#xff1a; 明確目標&#xff1a;需清楚目標網站爬&#xff1a;將所有的目標網站的內容全部爬下來取&#xff1a;在爬下來的網站內容中去掉對我們沒有用處的數據&#xff0c;只留取我們需要的數據處理數據&#xff1a;按…