堆外内存(直接内存)
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 堆外内存相对来说,不适合存储很复杂的对象。一般简单的对象或者扁平化的比较适合。
堆外内存(直接内存)相关推荐
- Spark 内存管理堆内和堆外内存规划_大数据培训
堆内和堆外内存规划 作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存.同时, ...
- jvm堆外内存--DirectByteBuffer
jvm的堆外内存本来是高贵而神秘的东西,只在一些缓存方案实战级别才会出现.但自从用了Netty等高并发IO框架后,就变成了天天与堆外内存打交道,在mina,netty等nio框架中屡见不鲜.堆外内存的 ...
- Spark 内存管理 spark.executor.memory /spark.memory.fraction/spark.memory.offHeap.size【堆外内存/内存管理】 钨丝计划
spark1.6及之后: 堆内内存: spark.executor.memory 包含 spark.memory.fraction: spark.memory.fraction 包含 spark.me ...
- 浅谈Java堆内内存、堆外内存、直接内存、用户空间和内核空间
我们都知道Java中大多数的对象都存在于堆内存中,那什么是堆外内存.直接内存?它们又分别用来做什么?分布在用户空间还是内核空间? 首先,有个前置知识点,所谓的Java程序,其实可以理解为是用C/C++ ...
- jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射
更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...
- Java堆外内存的使用
堆外内存的回收见HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer 基本类型长度 在Java中有很多的基本类型,比如: byte,一个字节是8位bi ...
- 一文探讨堆外内存的监控与回收
引子 记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可 ...
- Netty堆外内存泄露排查与总结
导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...
- JVM NativeMemoryTracking 分析堆外内存泄露
为什么80%的码农都做不了架构师?>>> Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能.我们可以利用j ...
- minecraft_MineCraft和堆外内存
minecraft 总览 MineCraft是一个很好的例子,说明何时堆外内存确实可以提供帮助. 关键要求是: 保留的数据大部分是一个简单的数据结构(在Minecraft的情况下,其很多字节[]) 堆 ...
最新文章
- 一致性hash算法虚拟节点_一致性哈希算法——虚拟节点
- CodeForces 660B Seating On Bus
- 区块链之智能合约入门
- linux solrcloud zookeeper分布式集群部署
- filter执行先后问题_filter的执行顺序是怎样的?
- FCOS: A Simple and Strong Anchor-free Object Detector
- python语言应用章节答案_智慧树APPPython语言应用第十单元章节测试答案
- 苹果系统备份文件服务器地址,IOS备份到tftp服务器和升级IOS
- labview获取窗口句柄_API---如何获得窗口句柄(HWND)
- java简历自我评价_java程序员简历自我评价怎么写
- 开源免费etl作业批量调度必备软件 Taskctl Free应用版
- 【caffe】Layer解读之:Date
- C# 公历日期时间转农历日期方法 注解解读
- .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
- clonezilla使用_使用Clonezilla克隆Windows和Linux驱动器和分区
- Vue中时间日期格式化
- 解决微信内置浏览器屏蔽下载链接问题
- 2019校园招聘深信服数组翻转题
- 31.3 Java进阶之lambda方法引用
- XFS 存储核心技术详解
热门文章
- windows中bat脚本编写
- python获取每月的最后一天
- 阿里云域名购买与域名解析使用教程
- AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0.
- 如何解决跨站脚本攻击
- matlab function调用m文件,matlab下编写和调用函数(在同一个m文件中)
- python中的框架是什么_python开发框架介绍
- 液晶屏COG封装技术-工业显示领域主流
- 云服务器怎么设置虚拟IP,云服务器能起虚拟ip吗
- 超简单的 VIM 练级攻略