精华内容
下载资源
问答
  • java NIO heap Buffer和direct Bufferheap bufferdirect buffer Java NIO中的direct buffer(主要是DirectByteBuffer),分两部分: java | native | Dire...

    java NIO heap Buffer和direct Buffer

    Java NIO中的direct buffer(主要是DirectByteBuffer),分两部分:

                      java       |      native   
                                 |
             DirectByteBuffer    |     malloc'd
               [    address   ] -+-> [   data    ]
                                 |
    

    其中 DirectByteBuffer 自身是一个Java对象,在Java堆中;而这个对象中有个long类型字段address,记录着一块调用 malloc() 申请到的native memory。
    direct buffer的JAVA对象是归GC管理的,只要GC回收了它的JAVA对象,操作系统才会释放direct buffer所申请的空间。

    展开全文
  • heap buffer分配在堆上,由Java虚拟机负责回收,direct buffer通过JNI在Java虚拟机外的内存申请一块缓冲区,不直接由Java虚拟机负责垃圾回收,当GC回收direct buffer对象时,操作系统释放direct buffer申请的空间。...

    heap buffer分配在堆上,由Java虚拟机负责回收,direct buffer通过JNI在Java虚拟机外的内存申请一块缓冲区,不直接由Java虚拟机负责垃圾回收,当GC回收direct buffer对象时,操作系统释放direct buffer申请的空间。


    劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高;

    优势:当我们把一个Direct Buffer写入Channel的时候,就好比是“内核缓冲区”的内容直接写入了Channel,这样显然快了,减少了数据拷贝(因为我们平时的read/write都是需要在I/O设备与应用程序空间之间的“内核缓冲区”中转一下的)。而当我们把一个Heap Buffer写入Channel的时候,实际上底层实现会先构建一个临时的Direct Buffer,然后把Heap Buffer的内容复制到这个临时的Direct Buffer上,再把这个Direct Buffer写出去。当然,如果我们多次调用write方法,把一个Heap Buffer写入Channel,底层实现可以重复使用临时的Direct Buffer,这样不至于因为频繁地创建和销毁Direct Buffer影响性能。
    展开全文
  • 1、 劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高。2、 差别:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAVA对象是归GC管理的,只要GC回收了它的JAVA对象。操作系统才会释放...
    1、 劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高。 
    2、 差别:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAVA对象是归GC管理的,只要GC回收了它的JAVA对象。操作系统才会释放Direct Buffer所申请的空间)。它似乎给人感觉是“内核缓冲区(buffer in kernel)”。Heap Buffer则是分配在堆上的,或者我们能够简单理解为Heap Buffer就是byte[]数组的一种封装形式,查看JAVA源码实现,Heap Buffer也的确是这样。 
    3、 优势:当我们把一个Direct Buffer写入Channel的时候。就好比是“内核缓冲区”的内容直接写入了Channel。这样显然快了,降低了数据拷贝(由于我们平时的read/write都是须要在I/O设备与应用程序空间之间的“内核缓冲区”中转一下的)。而当我们把一个Heap Buffer写入Channel的时候,实际上底层实现会先构建一个暂时的Direct Buffer。然后把Heap Buffer的内容拷贝到这个暂时的Direct Buffer上。再把这个Direct Buffer写出去。

    当然,假设我们多次调用write方法。把一个Heap Buffer写入Channel,底层实现能够反复使用暂时的Direct Buffer,这样不至于由于频繁地创建和销毁Direct Buffer影响性能。 


    简单的说,我们须要牢记三点: 
    (1) 平时的read/write。都会在I/O设备与应用程序空间之间经历一个“内核缓冲区”。

     


    (2) Direct Buffer就好比是“内核缓冲区”上的缓存。不直接受GC管理;而Heap Buffer就不过byte[]字节数组的包装形式。因此把一个Direct Buffer写入一个Channel的速度要比把一个Heap Buffer写入一个Channel的速度要快。 
    (3) Direct Buffer创建和销毁的代价非常高,所以要用在尽可能重用的地方

    转载于:https://www.cnblogs.com/cxchanpin/p/7160642.html

    展开全文
  • Heap Buffer和Direct Buffer

    2014-09-18 19:07:58
    1、Heap Buffer 堆内存字节缓冲区,可以被JVM自动回收,特点是内存的分配和回收速度快,缺点是如果进行Socket的I/O读写,需要额外的做一次内存复制,将堆内存对应的缓存区复制到内核Channel中,性能会有一定程度的...

    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,这样组合使用能达到最优性能。

     

    展开全文
  • 1、 劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高;  2、 区别:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAVA对象是归GC管理的,只要GC回收了它的JAVA对象,操作系统才...
  • Java NIO中,关于DirectBuffer,HeapBuffer的疑问? DirectBuffer 属于堆外存,那应该还是属于用户内存,而不是内核内存? FileChannel 的read(ByteBuffer dst)函数,write(ByteBuffer src)函数中,如果传入的...
  • NIO-HeapBuffer 对于网络编程来说,缓冲区Buffer是数据的容器,缓冲区的好坏会直接影响到整个传输的性能,Java中的Buffer是NIO下的一个抽象类,其常用子类有ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、...
  • Java NIO中,关于DirectBuffer,HeapBuffer的疑问? https://www.zhihu.com/question/57374068
  • heap buffer 和 direct buffer区别在Java的NIO中,我们一般采用ByteBuffer缓冲区来传输数据,一般情况下我们创建Buffer对象是通过ByteBuffer的两个静态方法:ByteBuffer.allocate(int capacity); ByteBuffer.wrap...
  • 今天调试测试代码时,发现在用完了new出来的内存buf后,在执行delete时报错了,具体信息为: HEAP_CORRUPTION_DETECTED: after ... CRT detected that the application wrote to memory after end of heap buffer .
  • CRT detected that the application wrote to memory after end of heap buffer……错误截图错误原因相信大家看到这个错误都会有亲切感,尤其是对内存进行操作的时候,这个错误时常发生!下面是摘自网友的一段解释:...
  • CRT detected that the application wrote to memory after end of heap buffer错误 转载:http://blog.csdn.net/wu_lai_314/article/details/82416...
  • 最近在调试代码的时候遇到这样一个错误:detected that the application wrote to memory after end of heap buffer,图示如下: 报错代码块如下: pResOut->text = (unsigned char *)malloc(strlen(enc_...
  • HEAP COPRUPTION DETECTED:CRT detected that the application wrote to memory after end of heap buffer (注:由于我的文件太庞大,所以换成下面简单代码展示改错误) 原因分析: 提示:这里填写问题的分析: ...
  • 转:...CRT detected that the application wrote to memory after end of heap buffer 多是中间对其进行了一些操作,在程序结束处,释放内存的时候,引起错误: HEAP CORRUPTION DETECTED:after ...
  • 1、 劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高; 2、 区别:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAVA对象是归GC管理的,只要GC回收了它的JAVA对象,操作系统才会...
  • 前言 在使用Java NIO时,会经常和ByteBuffer打交道(吐槽下,每次手动flip...Heap Buffer 字面意思,在java heap上分配的内存。此块内存区域受JVM管理,GC负责回收。使用时无需担心Heap Buffer的回收问题。 Direct B
  • CRT detected that the application wrote to memory after end of heap buffer 多是中间对其进行了一些操作,在程序结束处,释放内存的时候,引起错误: HEAP CORRUPTION DETECTED:after Normal block(#***) at ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,363
精华内容 22,945
关键字:

heapbuffer