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 堆中来回复制数据。

import sun.nio.ch.DirectBuffer;import java.nio.ByteBuffer;public class Main {public static void main(String[] args) throws InterruptedException {System.out.println("Hello World!");ByteBuffer bb = ByteBuffer.allocateDirect(1024 * 1024 * 128);Thread.sleep(10000);((DirectBuffer)bb).cleaner().clean();Thread.sleep(10000);}
}

可以在任务管理器那观察变化

堆外内存的优点和缺点

堆外内存,其实就是不受JVM控制的内存。相比于堆内内存有几个优势:
  1 减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作(可能使用多线程或者时间片的方式,根本感觉不到)
  2 加快了复制的速度。因为堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在发送;而堆外内存相当于省略掉了这个工作。
  而福之祸所依,自然也有不好的一面:
  1 堆外内存难以控制,如果内存泄漏,那么很难排查
  2 堆外内存相对来说,不适合存储很复杂的对象。一般简单的对象或者扁平化的比较适合。

堆外内存(直接内存)相关推荐

  1. Spark 内存管理堆内和堆外内存规划_大数据培训

    堆内和堆外内存规划 作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存.同时, ...

  2. jvm堆外内存--DirectByteBuffer

    jvm的堆外内存本来是高贵而神秘的东西,只在一些缓存方案实战级别才会出现.但自从用了Netty等高并发IO框架后,就变成了天天与堆外内存打交道,在mina,netty等nio框架中屡见不鲜.堆外内存的 ...

  3. Spark 内存管理 spark.executor.memory /spark.memory.fraction/spark.memory.offHeap.size【堆外内存/内存管理】 钨丝计划

    spark1.6及之后: 堆内内存: spark.executor.memory 包含 spark.memory.fraction: spark.memory.fraction 包含 spark.me ...

  4. 浅谈Java堆内内存、堆外内存、直接内存、用户空间和内核空间

    我们都知道Java中大多数的对象都存在于堆内存中,那什么是堆外内存.直接内存?它们又分别用来做什么?分布在用户空间还是内核空间? 首先,有个前置知识点,所谓的Java程序,其实可以理解为是用C/C++ ...

  5. jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射

    更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...

  6. Java堆外内存的使用

    堆外内存的回收见HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer 基本类型长度 在Java中有很多的基本类型,比如: byte,一个字节是8位bi ...

  7. 一文探讨堆外内存的监控与回收

    引子 记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可 ...

  8. Netty堆外内存泄露排查与总结

    导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...

  9. JVM NativeMemoryTracking 分析堆外内存泄露

    为什么80%的码农都做不了架构师?>>>    Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能.我们可以利用j ...

  10. minecraft_MineCraft和堆外内存

    minecraft 总览 MineCraft是一个很好的例子,说明何时堆外内存确实可以提供帮助. 关键要求是: 保留的数据大部分是一个简单的数据结构(在Minecraft的情况下,其很多字节[]) 堆 ...

最新文章

  1. 一致性hash算法虚拟节点_一致性哈希算法——虚拟节点
  2. CodeForces 660B Seating On Bus
  3. 区块链之智能合约入门
  4. linux solrcloud zookeeper分布式集群部署
  5. filter执行先后问题_filter的执行顺序是怎样的?
  6. FCOS: A Simple and Strong Anchor-free Object Detector
  7. python语言应用章节答案_智慧树APPPython语言应用第十单元章节测试答案
  8. 苹果系统备份文件服务器地址,IOS备份到tftp服务器和升级IOS
  9. labview获取窗口句柄_API---如何获得窗口句柄(HWND)
  10. java简历自我评价_java程序员简历自我评价怎么写
  11. 开源免费etl作业批量调度必备软件 Taskctl Free应用版
  12. 【caffe】Layer解读之:Date
  13. C# 公历日期时间转农历日期方法 注解解读
  14. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
  15. clonezilla使用_使用Clonezilla克隆Windows和Linux驱动器和分区
  16. Vue中时间日期格式化
  17. 解决微信内置浏览器屏蔽下载链接问题
  18. 2019校园招聘深信服数组翻转题
  19. 31.3 Java进阶之lambda方法引用
  20. XFS 存储核心技术详解

热门文章

  1. windows中bat脚本编写
  2. python获取每月的最后一天
  3. 阿里云域名购买与域名解析使用教程
  4. AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0.
  5. 如何解决跨站脚本攻击
  6. matlab function调用m文件,matlab下编写和调用函数(在同一个m文件中)
  7. python中的框架是什么_python开发框架介绍
  8. 液晶屏COG封装技术-工业显示领域主流
  9. 云服务器怎么设置虚拟IP,云服务器能起虚拟ip吗
  10. 超简单的 VIM 练级攻略