堆外内存(直接内存)
来源:互联网 发布:淘宝pc转无线连接 编辑:程序博客网 时间:2024/04/25 20:14
HeapByteBuffer与DirectByteBuffer,在原理上,前者可以看出分配的buffer是在heap区域的,其实真正flush到远程的时候会先拷贝得到直接内存,再做下一步操作(考虑细节还会到OS级别的内核区直接内存),其实发送静态文件最快速的方法是通过OS级别的send_file,只会经过OS一个内核拷贝,而不会来回拷贝;在NIO的框架下,很多框架会采用DirectByteBuffer来操作,这样分配的内存不再是在java heap上,而是在C heap上,经过性能测试,可以得到非常快速的网络交互,在大量的网络交互下,一般速度会比HeapByteBuffer要快速好几倍。
直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError 异常出现,所以我们放到这里一起讲解。
在JDK 1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可以使用Native 函数库直接分配堆外内存,然后通过一个存储在Java 堆里面的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java 堆和Native 堆中来回复制数据。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
可以在任务管理器那观察变化
堆外内存的优点和缺点
堆外内存,其实就是不受JVM控制的内存。相比于堆内内存有几个优势:
1 减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作(可能使用多线程或者时间片的方式,根本感觉不到)
2 加快了复制的速度。因为堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在发送;而堆外内存相当于省略掉了这个工作。
而福之祸所依,自然也有不好的一面:
1 堆外内存难以控制,如果内存泄漏,那么很难排查
2 堆外内存相对来说,不适合存储很复杂的对象。一般简单的对象或者扁平化的比较适合。
- 堆外内存(直接内存)
- 堆外内存(直接内存)
- JAVA直接内存(堆外内存)
- 堆内存和堆外内存(又名直接内存)优缺点
- 堆内存和堆外内存(又名直接内存)比较
- Java直接(堆外)内存使用详解
- Java直接(堆外)内存使用详解
- jvm堆外直接内存实现高性能接入层
- 堆外直接内存实现高性能接入层
- 堆内内存还是堆外内存?
- 堆内存和堆外内存
- java内存(堆内存、栈内存)
- 直接内存和堆内存的性能比较
- java直接内存与堆内存的比较
- Java直接内存和堆内存的性能比较
- Java直接内存和堆内存的性能比较
- 直接内存和堆内存的性能比较
- 使用堆外内存
- AndroidN SurfaceComposerClient 时序图
- Listener 监听器
- VMware中CentOS下安装vmWare tools
- 同台机器上安装两个jdk版本,想要那个就要那个版本;
- CTime和CTimeSpan与COleDateTime和COleDateTimeSpan 类
- 堆外内存(直接内存)
- ABAP负号提前的测试
- 如何编辑pdf文件的背景内容
- Perf -- Linux下的系统性能调优工具(引用博客)
- 背包问题的递归形式解
- url 编码(percentcode 百分号编码)
- [译] 关于 Git 你需要知道的一些事情
- 错误宏定义ERR_EXIT
- spring boot整合redis实现缓存机制