Netty中ByteBuf物件的建立方式對記憶體的影響
在使用netty 的時候,發現讓單機的支援量加大的時候,記憶體也隨著程式的執行一直增長,原因就是因為ByteBuf物件的建立方式不夠合理。現做簡單的分析和整理:
ByteBuf是netty中提供的一種資料結構,經過檢視原始碼發現,建立ByteBuf物件主要有兩種方式:
UnpooledByteBufAllocator:預設的建立方式
PooledByteBufAllocator:不是預設的,可以重複利用之前分配的記憶體空間。
這兩個類,都是AbstractByteBufAllocator的子類,
AbstractByteBufAllocator實現了一個介面,叫做ByteBufAllocator。
在使用預設的UnpooledByteBufAllocator的方式建立ByteBuf的時候,單臺24核CPU的伺服器,16G記憶體,剛啟動時候,10000個長連線,每隔幾秒就發一條群組訊息,記憶體佔到10G多點,但隨著系統的執行,記憶體不斷增長,直到整個系統記憶體溢位掛掉。
把UnpooledByteBufAllocator換成PooledByteBufAllocator,記憶體使用量機器能維持在一個連線佔用0.9-1M之間,經常長期的執行測試,發現都能維持在這個數量。
使用方法如下:
1 2 3 4 5 6 7 8 9 10 |
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel. class )
.childHandler(createInitializer())
.option(ChannelOption.SO_BACKLOG, 1024 )
.option(ChannelOption.SO_RCVBUF, 1024 * 256 )
.option(ChannelOption.SO_SNDBUF, 1024 * 256 )
.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
.childOption(ChannelOption.SO_KEEPALIVE, true );
|
另外ChannelOption中的引數也有很多可以優化的。
另外發現了一片類似問題的部落格。
Netty5.0的功能也是越來越強大,所以直接就把原來的3.6的版本系統直接升級到了5.0的,需要說明的是Netty5.0一定要配合JDK7 64位才能表現良好。在學習和使用Netty5.0中發現使用的Reactor執行緒模型,能使得對CPU的利用達到飽和狀態,是併發程式設計的首選。
關於Netty5的一些新特性,也看到有人整理的資料,轉載一下:
相關推薦
Netty中ByteBuf物件的建立方式對記憶體的影響
在使用netty 的時候,發現讓單機的支援量加大的時候,記憶體也隨著程式的執行一直增長,原因就是因為ByteBuf物件的建立方式不夠合理。現做簡單的分析和整理: ByteBuf是netty中提供的一種資料結構,經過檢視原始碼發現,建立ByteBuf物件主要有兩種方式
Java中String物件建立
文章目錄 1 String a="abc"與String b=new String("abc")一樣嗎,難道也是語法糖??? 2 String a="abc"要建立幾個物件?? 3 String a="abc";String b=new Str
js中函式物件建立的總結
在JavaScript的函式物件建立方法中,可以分為三種情況: 1:第一種是使用function語句定義函式 1 <script type="text/javascript"> 2 function fun1(){ 3 alert("我的第一個方法"); 4 } 5
我不想成為鹹魚系列之字串建立方式及記憶體的簡單分析
前言:今天不學習,明天變鹹魚 我們都知道建立字串的方式有兩種(基本的建立方式,clone序列化...不考慮) a.String s1 = "asdf"; b.String s2 = new String("asdf"); 我們首先分析下他在記憶體中的分配情況: 對於s1來說他
20170807ceph入門(一)——ceph中rados物件建立以及檔案上傳與下載
ceph中rados物件建立以及檔案上傳與下載 一、將本地檔案 /home/liangwl/file 檔案拷貝到 cephpool 這個池中,並在pool中檢視這個檔案中的內容 環境:3臺monitor,3個osd 檢視pool rados lspools 1. 我們先
【XML解析】(1)Java下使用JAXP中的DOM解析方式對XML文件進行解析
關於JAXP、DOM、SAX: 何為JAXP? JAXP(JavaApi for Xml Programming) – sun公司的一套操作XML的API。 JAXP中分為三種解析方式: DOM解析、SAX解析、StAX
Spring概念和三種物件建立方式
目錄 概念 Spring IOC ( 反轉控制) DI(依賴注入) BeanFactory ApplicationContext Bean元素的scope屬性 三種物件建立方式 構
Netty 中 EventLoopGroup 的建立
本文是基於 Netty 4.1.6.Final 的原始碼來分析的。 在分析原始碼之前做一些準備工作: 先熟悉一下 IDEA 的幾個快捷鍵,能極大的提高我們檢視原始碼的效率: Ctrl + Alt + B:用滑鼠點選指定的方法,然後按下快捷鍵,IDEA 就會跳轉到該方法的定義的地方,如果
netty中ByteBuf部分的分析
好久木有看程式碼了,今天把以前讀netty原始碼的時候一直沒有看的Buffer部分粗略的看了下,剛開始主要是覺得buffer這個包裡面類太多了,覺得比較麻煩,而且相對理解整個netty的設計不太影響,所以就拖著沒看,但是記得有一次跟支付寶的技術問了我關於netty中buff
javascript最常用的物件建立方式
1 //第一種 2 function Demo(){ 3 var obj=new Object(); 4 obj.name="Yubaba"; 5 obj.age=12; 6 obj.firstF=function(){ 7 } 8
檔案系統中的物件總結及對目錄項物件的重點理解
檔案系統中主要物件:●超級塊(superblock)物件: 存放系統中已安裝檔案系統的有關資訊。對於基於磁碟的檔案系 統(具有I/O操作),這類物件通常對應於存放在磁碟上的檔案系統控制塊(FCB),也就是說, 每個檔案系統都有一個超級塊物件。●索引節點(inode)物件: 存
Struts2+Spring整合後Action物件建立方式
1、Spring容器建立:(web.xml中配置) Xml程式碼 <!-- spring配置檔案--> <context-param> <param-name>contextConfigLoc
Java物件建立過程和記憶體結構分析
JAVA記憶體分配和管理是JAVA的核心技術之一,在看了尚矽谷宋紅康老師講解的JAVA記憶體知識之後,結合《深入理解JVM這本書》對自己所學的知識進行簡單的總結,寫了這篇日誌。 1.JAVA記憶體分割槽 根據儲存資料的不同,java記憶體通常被劃分為5個區域:程式計數器(
UIImage獲取本地圖片的方式對記憶體的影響
前言 在我們的日常開發中很多時候都會經常使用到圖片,在ios開發中經常會用到UIImage來獲取到圖片,然後,在將其顯示出來,然而不同的方式對記憶體的影響是不同的。 獲取Image的方式 一般來說獲
Hibernate入門(四)之hibernate中session的建立方式
為什麼要專注於session的建立方式 在有些場景必須關注session的建立,比如說在銀行轉賬操作的時候,兩個賬戶轉賬必須在同一個session中 如上面所示,賬戶1錢沒了,賬戶2錢卻
js中的物件建立的模式
開發十年,就只剩下這套架構體系了! >>>
Netty中NioEventLoopGroup的建立原始碼分析
NioEventLoopGroup的無參構造: 1 public NioEventLoopGroup() { 2 this(0); 3 } 呼叫了單參的構造: 1 public NioEventLoopGroup(int nThreads) { 2 this(nThre
Java 中建立物件的方式
1. 使用new關鍵字建立物件 Student stu = new Student(); 2. 使用Class類的newInstance方法(反射機制) // 呼叫無參的構造器建立物件 Student stu = (Student) Class.forName("Stude
Java中建立物件的方式有幾種?
建立物件的方式 方式 是否呼叫了建構函式 使用new關鍵字 是 使用Class類的newInstance方法 是 使用Constructor類的newInstance方法 是 使用clone方法 否 使用反序列化 否
javaScript 建立物件的方式的四種模式探討,this指向問題,以及Jquery中物件的建立
在javaScript中,建立物件一共有四種方式,廢話少說:看程式碼 1 Json格式,字面量方式建立: <script> var persion ={ name:"xiaoheng",