缓冲池java_了解Java缓冲池
緩沖池java
了解Java緩沖池
緩沖池空間位于垃圾收集器管理的內(nèi)存之外。 這是分配本地堆外內(nèi)存的一種方法。 使用緩沖池有什么好處? 為了回答這個(gè)問題,讓我們首先了解什么是字節(jié)緩沖區(qū)。
字節(jié)緩沖區(qū)
非直接緩沖區(qū)
ByteBuffer類附帶了java.nio包。 它允許我們分配直接和非直接字節(jié)緩沖區(qū)。 非直接字節(jié)緩沖區(qū)沒有什么特別的-它們是由ByteBuffer.allocate()和ByteBuffer.wrap()工廠方法創(chuàng)建的HeapByteBuffer的實(shí)現(xiàn)。 就像該類的名稱所暗示的那樣,這些是堆上字節(jié)緩沖區(qū)。 那么,在Java堆空間上分配所有緩沖區(qū)會(huì)不會(huì)更容易? 為什么有人需要在本機(jī)內(nèi)存中分配某些內(nèi)容? 要回答這個(gè)問題,我們需要了解操作系統(tǒng)如何執(zhí)行I / O操作。 任何讀或?qū)懼噶疃荚谶B續(xù)的字節(jié)序列存儲(chǔ)區(qū)上執(zhí)行。 那么byte[]是否在堆上占據(jù)了連續(xù)的空間? 盡管從技術(shù)上講是有意義的,但JVM規(guī)范沒有這樣的保證。 更有趣的是, 規(guī)范甚至不能保證堆空間本身是連續(xù)的! 盡管JVM不太可能將一維原語數(shù)組放置在內(nèi)存中的不同位置,但是Java堆空間中的字節(jié)數(shù)組不能直接用于本機(jī)I / O操作。 必須在每次I / O之前將其復(fù)制到本機(jī)內(nèi)存中,這當(dāng)然會(huì)導(dǎo)致明顯的低效率。 因此,引入了直接緩沖區(qū)。
直接緩沖
直接緩沖區(qū)是與Java共享的本機(jī)內(nèi)存塊,您可以從中執(zhí)行直接讀取。 可以使用ByteBuffer.allocateDirect()工廠方法創(chuàng)建DirectByteBuffer的實(shí)例。 字節(jié)緩沖區(qū)是執(zhí)行I / O操作的最有效方法,因此,它們在許多庫和框架中使用,例如在Netty中。
內(nèi)存映射緩沖區(qū)
直接字節(jié)緩沖區(qū)也可以通過將文件區(qū)域直接映射到內(nèi)存中來創(chuàng)建。 換句話說,我們可以將文件的區(qū)域加載到可以稍后訪問的特定本機(jī)內(nèi)存區(qū)域。 您可以想象,如果我們需要多次讀取文件內(nèi)容,它可以顯著提高性能。 借助內(nèi)存映射文件,后續(xù)讀取將使用內(nèi)存中文件的內(nèi)容,而不是每次需要時(shí)都從光盤加載數(shù)據(jù)。 MappedByteBuffer可以通過創(chuàng)建FileChannel.map()方法。
內(nèi)存映射文件的另一個(gè)優(yōu)點(diǎn)是,當(dāng)系統(tǒng)關(guān)閉時(shí),操作系統(tǒng)可以直接將緩沖區(qū)刷新到磁盤。 而且,操作系統(tǒng)可以鎖定文件的映射部分,使其免受計(jì)算機(jī)上其他進(jìn)程的影響。
分配很貴
直接緩沖區(qū)的問題之一是分配它們很昂貴。 無論緩沖區(qū)的大小如何,調(diào)用ByteBuffer.allocateDirect()都是一個(gè)相對較慢的操作。 因此,對于大型和長壽命的緩沖區(qū)使用直接緩沖區(qū),或者創(chuàng)建一個(gè)大型緩沖區(qū),按需分割部分,并在不再需要它們時(shí)將它們返回以重新使用,效率更高。 當(dāng)切片的大小不總是相同時(shí),可能會(huì)出現(xiàn)切片問題。 當(dāng)分配和釋放不同大小的對象時(shí),初始的大字節(jié)緩沖區(qū)可能會(huì)變得碎片化。 與Java堆不同,直接字節(jié)緩沖區(qū)無法壓縮,因?yàn)樗皇抢占鞯哪繕?biāo)。
監(jiān)視緩沖池的使用
如果您對應(yīng)用程序使用的直接或映射字節(jié)緩沖區(qū)的數(shù)量感興趣,則可以使用許多工具(包括VisualVM(帶有BufferMonitor插件)和FusionReactor)輕松監(jiān)視它們。 Java將根據(jù)需要增加緩沖池,因此“已使用的直接內(nèi)存”涵蓋了下圖的“直接容量”這一事實(shí),這意味著迄今為止分配的所有緩沖內(nèi)存都在使用中。
請注意–您可以使用-XX:MaxDirectMemorySize=N標(biāo)志來限制應(yīng)用程序可以分配的直接字節(jié)緩沖區(qū)空間量。 盡管這是可行的,但您將需要一個(gè)很好的理由。
翻譯自: https://www.javacodegeeks.com/2018/03/understanding-java-buffer-pool.html
緩沖池java
總結(jié)
以上是生活随笔為你收集整理的缓冲池java_了解Java缓冲池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jdk8 获取上一个月时间_JDK 10
- 下一篇: 电脑绘图软件简单(电脑简单绘图软件有哪些