转自: http://code.google.com/p/hatter-source-code/wiki/Study_Java_HotSpot_DirectBuffer
简介及其原理
DirectBuffer 通过免去中间交换的内存拷贝, 提升IO处理速度;也就是常说的zero-copy
- ByteBuffer
- HeapByteBuffer
- MappedByteBuffer
- MappedByteBuffer.map(int mode,long position,long size);
READ_ONLY | 只读 | 试图修改得到的缓冲区将导致抛出 ReadOnlyBufferException |
READ_WRITE | 读/写 | 对得到的缓冲区的更改最终将传播到文件;该更改对映射到同一文件的其他程序不一定是可见的 |
PRIVATE | 专用 | 对得到的缓冲区的更改不会传播到文件,并且该更改对映射到同一文件的其他程序也不是可见的;相反,会创建缓冲区已修改部分的专用副本 |
分配 | java.nio.ByteBuffer.allocateDirect |
释放 | sun.nio.ch.DirectBuffer.cleaner().clean() |
可以通过参数 -XX:MaxDirectMemorySize= 设置其可使用的最大内存大小,当未设置时默认同 -Xmx 的大小。
各种应用
BigMemory | http://terracotta.org/products/bigmemory | BigMemory stores “big” amounts of data in machine memory for ultra-fast access |
DirectMemory | http://incubator.apache.org/directmemory/ | Apache DirectMemory is a multi layered cache implementation featuring off-heap memory management (a-la BigMemory) to enable efficient handling of a large number of java objects without affecting jvm garbage collection performance |
HugeCollections | https://code.google.com/p/vanilla-java/wiki/HugeCollections | If you want to efficiently store large collections of data in memory. This library can dramatically reduce Full GC times and reduce memory consumption as well |
OutOfMemoryError
和 DirectBuffer 相关的内存泄漏参看Study_Java_HotSpot_OOME
参考资料
[1]. http://blog.csdn.net/fancyerii/article/details/7655451
[2]. http://lixjluck.iteye.com/blog/1130455
[3]. http://www.zhurouyoudu.com/index.php/archives/470/
相关推荐
Buffer分为两种类型:Heap Buffer和Direct Buffer。Heap Buffer存储在Java堆中,而Direct Buffer存储在系统内存中,直接与硬件交互,减少了Java虚拟机(JVM)的内存拷贝,提高了性能。然而,Direct Buffer可能会占用...
Buffer 是 Java 中一个非常重要的知识点,Direct Buffer 和 Heap Buffer 是两种不同的 Buffer,Direct Buffer 可以提高效率和减少GC 的频率,而 Heap Buffer 需要进行数据复制,因此效率较低。在实际开发中,应该...
【情况四】:`java.lang.OutOfMemoryError: Direct buffer memory` 这种情况发生在NIO(非阻塞I/O)中,因为直接缓冲区内存分配失败。可以通过设置`-XX:MaxDirectMemorySize`参数来限制直接内存大小,如`-XX:...
Heap Buffer存储在JVM堆中,而Direct Buffer则直接在操作系统分配的内存中,这使得它对内存管理的影响较小,对于大容量数据处理时,Direct Buffer通常能提供更好的性能,但会增加内存碎片的风险。 在实际应用中,...
- **Direct vs Non-Direct Buffer**: Direct Buffer直接映射到物理内存,Non-Direct Buffer在JVM堆上分配内存。 **3. Buffer的日常操作** - **put**: 向Buffer写入数据。 - **get**: 从Buffer读取数据。 - **flip*...
【系统稳定性——OutOfMemoryError常见原因及解决方法】 在Java应用程序中,系统稳定性的一个关键因素是避免出现`OutOfMemoryError`。这种错误通常表明JVM(Java虚拟机)的内存资源已经耗尽,无法继续正常运行。...
在OpenGL ES中,主要使用的是Buffer类来管理数据,它允许开发者以内存缓冲区的方式来处理大量的数据读写,并且可以避免Java垃圾回收机制的干扰,因为DirectBuffer可以直接从操作系统内存分配空间,这部分空间不会被...
ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024); ``` 2. **非直接缓冲区**: 非直接缓冲区是在Java堆中分配的,数据传输需要经过JVM堆。虽然它没有直接缓冲区那么高效,但在处理小数据量时,由于...
7. **零拷贝(Zero-Copy)**:Netty通过DirectBuffer和FileRegion实现零拷贝技术,减少了数据在内存中的复制,提高了性能。 8. **ChannelFuture和Promise**:ChannelFuture表示异步操作的结果,而Promise则用于设置...
- **Direct Buffer**:直接缓冲区是在本地内存而非Java堆上分配的内存,通常用于提高性能。 - **Heap Buffer**:堆缓冲区则是在Java堆上分配的内存。 #### Channel Channel是Java NIO中的另一个核心概念,它类似于...
Buffer类提供了高效的数据读写方法,并且可以创建不受垃圾回收机制控制的直接缓冲区(Direct buffer),以避免不必要的性能损耗。 在使用OpenGL ES进行Android开发时,了解和熟练运用Buffer类至关重要,因为它能...
3. 高性能 I/O 模型:Netty 使用了高性能的 I/O 模型,包括零拷贝和 Direct Buffer 等技术,来提高 I/O 操作的效率。 4. Pipeline 架构:Netty 的 Pipeline 架构可以使得处理逻辑清晰地分离关注点,使得开发和维护变...
JVM内存主要分为两大块:Java堆内存和直接内存映射(DirectBuffer占用)。推荐配置如下: - **堆内存**: 建议保持适中大小,例如在一个拥有16GB内存的服务器上,可以将Mycat的堆内存设置为4GB。 - **直接内存映射**...
8. java.lang.OutOfMemoryError:Direct buffer memory 该错误是由于Direct buffer memory的溢出。解决方法是调整-XX:MaxDirectMemorySize=参数。 9. java.lang.ArithmeticException 该错误是当出现异常的运算条件...
`UnpooledByteBufAllocator` 是一个工具类,用于创建这些 `ByteBuf` 实例,通常推荐使用 `Unpooled` 工具类中的静态方法,如 `directBuffer()` 或 `wrappedBuffer()` 来创建和管理 `ByteBuf`。 总的来说,`ByteBuf`...
在Android开发中,使用Java的NIO包(java.nio)的Buffer类来存储和传输图形数据,因为Buffer提供了高效的数据管理和内存操作,支持直接缓冲(Direct Buffer),避免了垃圾回收的开销,从而提升性能。 在实际开发中...
2. **内存池设计**:使用内存池(包括Direct Buffer)减少了对象的创建和销毁,提高了IO性能,并通过二叉查找树优化内存分配。 3. **内存零拷贝**:通过Direct Buffer支持Zero-Copy机制,减少了CPU上下文切换,提升...
通常情况下,JVM的内存分为两大部分:Java堆内存和直接内存映射(Direct Buffer)。建议将堆内存设置为适中大小,而直接内存映射则尽可能地大。 - 对于16GB内存的服务器,推荐配置为:Mycat堆内存4GB,直接内存映射...