簡體   English   中英

堆外 memory 是 Java/JVM 標准嗎?

[英]Is Off-heap memory is a Java/JVM standard?

我正在閱讀 HBase 文檔並遇到了堆外讀取路徑據我了解,堆外是 memory 中的一個地方,其中 Java 存儲垃圾收集器范圍之外的字節/對象。 我還去搜索了一些有助於使用堆外 memory 的庫並找到了 Ehcatche但是,我找不到來自 oracle 或 Z18B5A217C4DAD25662D3A05EDB0E3 的任何官方文檔。 那么這是 JVM 的標准功能還是某種 hack,如果它是用於執行此操作的底層類和技術是什么?

你應該尋找ByteBuffer

直接與非直接緩沖區

字節緩沖區可以是直接的,也可以是非直接的。 給定一個直接字節緩沖區,Java 虛擬機將盡最大努力直接在其上執行本機 I/O 操作。 也就是說,它將嘗試避免在每次調用底層操作系統的本機 I/O 操作之一之前(或之后)將緩沖區的內容復制到(或從)中間緩沖區。

可以通過調用此 class 的 allocateDirect 工廠方法來創建直接字節緩沖區。 此方法返回的緩沖區通常比非直接緩沖區具有更高的分配和釋放成本。 直接緩沖區的內容可能位於正常的垃圾收集堆之外,因此它們對應用程序的 memory 占用空間的影響可能並不明顯。 因此,建議將直接緩沖區主要分配給受底層系統的本機 I/O 操作影響的大型、長期存在的緩沖區。 通常,最好僅在直接緩沖區對程序性能產生可測量的增益時才分配它們。

也可以通過將文件的區域直接映射到 memory 來創建直接字節緩沖區。 Java 平台的實現可以選擇支持通過 JNI 從本機代碼創建直接字節緩沖區。 如果其中一種緩沖區的實例引用了 memory 的不可訪問區域,則訪問該區域的嘗試不會更改緩沖區的內容,並且會在訪問時或稍后引發未指定的異常時間。

字節緩沖區是直接的還是非直接的可以通過調用它的 isDirect 方法來確定。 提供此方法以便可以在性能關鍵代碼中完成顯式緩沖區管理。

如何處理直接 ByteBuffers 取決於 JVM 實現,但至少 OpenJDK JVM 正在堆外分配 memory。

JEP 383:外部內存訪問 API(第二孵化器)功能正在Java 15孵化 此功能將通過提供公共 API 來訪問堆外 memory 標准。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM