Heap Buffer和Direct Buffer

1、Heap Buffer

堆内存字节缓冲区,可以被JVM自动回收,特点是内存的分配和回收速度快,缺点是如果进行Socket的I/O读写,需要额外的做一次内存复制,将堆内存对应的缓存区复制到内核Channel中,性能会有一定程度的下降。

 

2、Direct Buffer

直接内存字节缓冲区,非堆内存,在堆外进行内存分配和回收,相比于堆内存,它的分配和回收速度会慢一些,但是将它写入或者从Socket Channel中读取时,由于少了一次内存复制,速度比堆内存快。

 

JDK1.4中新引入NIO类库,引入了一种基于通道(Channel)和缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作,也可能导致OOM异常。

 

下图为Netty提供的多种ByteBuf供使用,最佳实践是在I/O通信线程的读写到缓冲区使用Direct Buffer,后端的业务消息编解码模块使用Heap Buffer,这样组合使用能达到最优性能。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当您遇到 `java.lang.OutOfMemoryError: Java heap space` 这个错误,它是Java运行时环境中的常见错误,意味着程序请求的内存超过了JVM(Java Virtual Machine)能够分配的最大堆空间。堆是Java中用于存放对象实例和数组的主要内存区域。 以下是可能导致这个错误的一些原因: 1. **堆大小不足**:在启动达梦数据库服务器时,如果没有足够大或者没有正确配置堆内存大小,可能会导致这个错误。可以通过修改`-Xmx`和`-Xms`参数来调整JVM的初始堆大小和最大堆大小。 2. **内存泄漏**:如果程序中有内存泄漏,即使设置了较大的堆空间,随着程序运行,内存逐渐消耗,最终也会耗尽。 3. **大量数据加载**:如果一次性加载大量数据或对象,可能超过JVM的内存限制。 4. **并发执行过多**:高并发环境下的应用,每个线程都需要自己的堆空间,如果线程数过多,也可能触发此错误。 为了解决这个问题,你可以尝试以下操作: - **检查并调整堆内存大小**:确保JVM启动参数中对堆内存的设置足够大,例如 `-Xmx2g` 或更高,具体值取决于您的系统资源和需求。 - **分析内存使用情况**:使用Java内存分析工具(如VisualVM、JConsole等)检查程序运行时的内存占用情况。 - **优化代码**:识别并修复内存泄漏,避免不必要的数据结构和对象持有。 - **考虑使用非堆内存**:对于某些场景,可以利用Off-Heap Memory(如Direct Buffer)减少对堆内存的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值