屬性名 | 作用 | 類型 |
---|---|---|
mBuffersByLastUse | 按照最近使用對byte[]排序 | LinkedList |
mBuffersBySize | 按照byte[]大小對byte[]排序 | ArrayList |
[code] public synchronized byte[] getBuf(int len) { for (int i = 0; i < mBuffersBySize.size(); i++) { byte[] buf = mBuffersBySize.get(i); if (buf.length >= len) { mCurrentSize -= buf.length; mBuffersBySize.remove(i); mBuffersByLastUse.remove(buf); return buf; } } return new byte[len]; }方法的第2行代碼,遍歷mBuffersBySize,找到最適合len大小的byte[]。第6 ~8行更新緩存池中數據的大小,并從兩個數組中去除分配出去的byte[]。如果在緩存池中沒有要求的byte[],此時會從內存分配一跨區域返回。
此方法主要的功能: 不必每次存數據都要進行內存分配,而是先查找緩沖池中有無適合的內存區域,如果有,直接拿來用,從而減少內存分配的次數。 其實這個方法有改進空間:由于在類中有一個mSizeLimit屬性,表示此緩沖區的最大值。我們可以在方法體的第一行判斷 len與mSizeLimit的大小,如否 len>mSizeLimit,直接進入到最后一句運行,否則,循環。修改后的方法如下:
= len) { mCurrentSize -= buf.length; mBuffersBySize.remove(i); mBuffersByLastUse.remove(buf); return buf; } } } return new byte[len]; }" data-sn將空間返回給緩存池如果只是拿數據,緩存區的只會越來越小,我們還需要向緩沖區中加入存儲空間。這個時候涉及到一個方法:returnBuf(byte[])。[code] public synchronized void returnBuf(byte[] buf) { if (buf == null || buf.length > mSizeLimit) { return; } mBuffersByLastUse.add(buf); int pos = Collections.binarySearch(mBuffersBySize, buf, BUF_COMPARATOR); if (pos < 0) { pos = -pos - 1; } mBuffersBySize.add(pos, buf); mCurrentSize += buf.length; trim(); }方法首先檢查 要插入的數據大小有沒有超出邊界,如果沒有,利用二分法找到插入位置,將數據插入到上述的兩個集合,完成排序。然后更新緩沖池的大小,以方便從緩沖區中取存儲空間。結語
ByteArrayPool利用getBuf和returnBuf以及mBuffersByLastUse和mBuffersBySize完成字節數組的緩存。當需要使內存區域的時候,先從已經分配的區域中獲得以減少內存分配次數。當空間用完以后,在將數據返回給此緩沖區。這樣,就會減少內存區域堆內存的波動和減少GC的回收,讓CPU把更多的性能留給頁面的渲染,提高性能。通過這個類發現,谷歌對技術的細節十分考究。
新聞熱點
疑難解答