5.Java程式最佳化-直接記憶體存取__Java

來源:互聯網
上載者:User

       Buffer提供了可以直接存取系統實體記憶體的類-DirectBuffer。DirectBuffer繼承自ByteBuffer,ByteBuffer任然在JVM堆上分配記憶體,其最大記憶體,受到最大堆的限制。而DirectBuffer直接分配到實體記憶體中,並不佔用堆空間。

       在對ByteBuffer進行訪問的時候,系統會使用一個“核心緩衝區”進行間接的操作。而DirectBuffer所處的位置就相當於這個“核心緩衝區”。

      因此,使用DirectBuffer是一種更接近系統底層的方法,速度會比ByteBuffer更快(快一倍左右)。但在建立和銷毀DirectBuffer的開銷卻遠比ByteBuffer高。

//申請DirectBuffer的方法如下ByteBuffer b = ByteBuffer.allocateDirect(500);

      在需要頻繁建立Buffer的場合,由於建立和銷毀DirectBuffer的代價比較高,是不適合使用DirectBuffer的,但如果是對DirectBuffer進行複用。那麼在讀寫比較頻繁的情況下,它可以大幅度改善系統效能。

       真實應用的時候,需要對DirectBuffer進行監控,以增強DirectBuffer的可用性。

private void monDirectBuffer() throws ClassNotFoundException,Exception,NoSuchFieldException{     Class c = Class.forName("java.nio.Bits");     //通過反射取得私人資料          Field maxMemory = c.getDeclaredField("maxMemory");     maxMemory.setAccessibly(true);     Field reservedMemory = c.getDeclaredField("reservedMemory");     reservedMemory.setAccessible(true);     synchronized(c){         Long maxMemoryValue = (Long)maxMemory.get(null);           //總大小         Long reservedMemoryValue = (Long)reservedMemory.get(null); //剩餘大小         System.out.println("maxMemoryValue: "+maxMemoryValue);         System.out.println("reservedMemoryValue: "+reservedMemoryValue);     }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.