日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BigMemroy系列文章--11. BigMemory中的SizeOf问题

發(fā)布時(shí)間:2025/6/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BigMemroy系列文章--11. BigMemory中的SizeOf问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載請(qǐng)注明出處哈:http://carlosfu.iteye.com/blog/2237511


?感謝博主:hot66hot.iteye.com/


?一:BigMemory如何使用DirectMemory內(nèi)存

?

? ?以下是bigMemory啟動(dòng)時(shí)打印的DirectMemory分區(qū)概述:

Maximum Size (specified) : 32MB
Minimum Chunk Size : 8MB
Maximum Chunk Size : 32MB
Concurrency : 16
Initial Segment Table Size : 64 slots
Segment Data Page Size : 64KB

?

根據(jù)日志,可以猜測出BigMemory預(yù)先將數(shù)據(jù)空間劃分為一系列Chunk,目的為了防止內(nèi)存碎片化,與Memcache內(nèi)存分配策略很像.

借用下memcache 的chunk空間分配過程圖,可以更好的理解.

?

有個(gè)問題:bigMemory必須知道存儲(chǔ)的對(duì)象所占用的空間,才能選擇合適的chunk存放對(duì)象.

?

二:BigMemory計(jì)算對(duì)象所占空間

?

EHCache計(jì)算一個(gè)實(shí)例占用的內(nèi)存大小。


基本思路:遍歷實(shí)例數(shù)上的所有節(jié)點(diǎn),對(duì)每個(gè)節(jié)點(diǎn)計(jì)算其占用的內(nèi)存大小。

使用反射的方式計(jì)算一個(gè)實(shí)例占用的內(nèi)存大小。

反射計(jì)算一個(gè)實(shí)例(instance)占用內(nèi)存大小(size)過程如下:?
? a. 如果instance為null,size為0,直接返回。?
? b. 如果instance是數(shù)組類型,size為數(shù)組頭部大小+每個(gè)數(shù)組元素占用大小* 數(shù)組長度+填充到對(duì)象對(duì)齊最小單位。?
? c. 如果instance是普通實(shí)例,size初始值為對(duì)象頭部大小,然后找到對(duì)象對(duì)應(yīng)類的所有繼承類,從最頂層類開始遍歷所有類,對(duì)每個(gè)類,紀(jì)錄長整型和雙精度型、整型和浮點(diǎn)型、短整型和字符型、布爾型和字節(jié)型以及引用類型的非靜態(tài)字段的個(gè)數(shù)。在所有類計(jì)算完成后,按類對(duì)齊規(guī)則對(duì)齊等

參考資料:http://www.importnew.com/1305.html

?

EHCache中的SizeOf類中采用deepSize計(jì)算,它的步驟是:使用ObjectGraphWalker遍歷一個(gè)實(shí)例的所有對(duì)象引用,在遍歷中通過使用傳入的SizeOfFilter過濾掉那些不需要的字段,然后調(diào)用傳入的Visitor對(duì)每個(gè)需要計(jì)算的實(shí)例做計(jì)算。?
ObjectGraphWalker的實(shí)現(xiàn)算法使用了Stack,也可以使用Queue,這個(gè)影響遍歷的順序,深度優(yōu)先還是廣度優(yōu)先的區(qū)別。它抽象了SizeOfFilter接口,可以用于過濾掉一些不想用于計(jì)算內(nèi)存大小的字段,如Element中的key字段。SizeOfFilter提供了對(duì)類和字段的過濾:

public interface SizeOfFilter { // Returns the fields to walk and measure for a type Collection<Field> filterFields(Class<?> clazz, Collection<Field> fields); // Checks whether the type needs to be filtered boolean filterClass(Class<?> klazz); }

?

? ?SizeOfFilter的實(shí)現(xiàn)類可以用于過濾過濾掉@IgnoreSizeOf注解的字段和類,以及通過net.sf.ehcache.sizeof.filter系統(tǒng)變量定義的文件,讀取其中的每一行為包名或字段名作為過濾條件。最后,為了性能考慮,它對(duì)一些計(jì)算結(jié)果做了緩存。?

結(jié)論: Bigmemory的主要開銷:序列化+sizeOf計(jì)算

?

三:sizeOf引擎優(yōu)化與測試:

?

1:對(duì)sizeOf引擎友好的對(duì)象:盡量使用不深/不廣的對(duì)象:深(繼承樹) 廣( bigPojo,ArrayList,HashMap等)

2:這邊使用了大量的ArrayList和HashMap 等對(duì)象.日志給出bigMemory警告如下,

2014-04-09 17:30:54,376 [DubboServerHandler-10.10.34.12:20880-thread-248] WARN net.sf.ehcache.pool.impl.DefaultSizeOfEngine (DefaultSizeOfEngine.java:194) - The configured limit of 2,000 object references was reached while attempting to calculate the size of the object graph. This can be avoided by adding stop points with @IgnoreSizeOf annotations. Since the CacheManger or Cache <sizeOfPolicy> elements maxDepthExceededBehavior is set to "abort", the sizing operation has stopped and the reported cache size is not accurate. If performance degradation is NOT an issue at the configured limit, raise the limit value using the CacheManager or Cache <sizeOfPolicy> elements maxDepth attribute. For more information, see the Ehcache configuration documentation.

?

為了減少sizeOf計(jì)算開銷,加入配置:計(jì)算超過2000次后終止,但這樣會(huì)造成chunk分配混亂.

?

<sizeOfPolicy maxDepth="2000" maxDepthExceededBehavior="abort"/>

?

3:采用protostuff預(yù)前序列化的方式,bigMemory只存protostuff序列化后的byte數(shù)組

如下圖:



?

?

?4:測試用例: 測試采用單線程壓測100W次,directMemory空間為100MB.,對(duì)象實(shí)際值完全相同.



?


四、結(jié)論:
?

1. 采用預(yù)序列化(protostuff)之后set性能有3倍的提高,get性能提高50%以上。

2. 隨著對(duì)象復(fù)雜度增加,相同空間預(yù)序列化(protostuff)方式占用空間更少,如HashMap的測試用例.

3. 但是如果對(duì)象是簡單的pojo,則原生的bigMemory占用空間更有優(yōu)勢.

4. 根據(jù)自身系統(tǒng)的對(duì)象類型做處理.

總結(jié)

以上是生活随笔為你收集整理的BigMemroy系列文章--11. BigMemory中的SizeOf问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。