堆外内存DirectByteBuffer剖析

Android在JNI中使用ByteBuffer的方法 主要介绍了Android在JNI中使用ByteBuffer的方法,涉及Android中缓冲区的相关使用技巧,需要的朋友可以参考下 立即下载


操作系统中除了jvm申请的内存外,还有一块jvm以外的内存,这块内存空间一船是连续的,DirectByteBuffer对象是在jvm申请和创建的,内容是在堆外内存存放的的,DirectByteBuffer保存申请堆外内存时的起始偏移地址和堆外内存申请的容量。

java.nio.DirectByteBuffer源码包含了这些类:


Bits:记录申请堆外内存的大小及创建Unsafe对象

Unsafe:申请堆外内存和销毁堆外内存

Deallocator:堆外内存回收线程

Cleaner: Cleaner.create()需要2个参数:第一个参数:需要监控的堆内存对象DirectByteBuffer,第二个参数:程序释放资源的回调Deallocator。当JVM进行GC的时候,如果发现我们监控的对象,不存在强引用了(只被Cleaner对象引用,这是个幽灵引用),就会调用第二个参数Deallocator.run()方法的逻辑,执行完Deallocator.run()的时候(这个时候已经释放了堆外内存),JVM会自动释放堆内存中我们监控的对象。

申请堆外内存步骤:

1.      调用unsafe.allocateMemory申请堆外内存并获得起始地址偏移量

2.      调用unsafe.setMemory始初化堆外内存数据为0

3.      调用Bits.reserveMemory保存申请的堆外内存的数量

4.      初始化Cleaner对象,传入回调线程Deallocator

 

回收逻辑是在Deallocator.run方法里:

1.      调用unsafe.freeMemory释放内存

2.      调用Bits.unreserveMemory减少堆外内存的数量

立创EDA手动拼板实战:当自带功能不够用,如何用‘复制粘贴’搞定异形拼版与特殊布局 本文详细介绍了立创EDA手动拼板技术在异形拼版与特殊布局中的应用实战。通过CTRL+SHIFT+V等核心操作技巧,解决混合尺寸拼板、特殊间距需求等复杂场景,提升PCB设计效率与灵活性,特别适合需要高精度控制的射频电路和医疗设备项目。 阅读详情

相关推荐

python代码爬取大众点评评论!直接copy就可以运行!

python代码爬取大众点评评论!直接copy就可以运行!

QiuQiRuQin的博客 1万+

堆外内存之 DirectByteBuffer 详解

堆外内存 堆外内存是相对于堆内内存的一个概念。堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理它们的内存。那么堆外内存就是存在于JVM管控之外的一块内存区域,因此它是不受JVM的管控。 在讲解DirectByteBuffer之前,需要先简单了解两个知识点。 java引用类

lz710117239的博客 1945

chipseeker Y叔

这一次讲解非常重要的peak注释,注释在ChIPseeker里只需要用到一个函数annotatePeak,它可以满足大家各方面的需求。 输入 当然需要我们上次讲到的BED文件,ChIPseeker自带了5个BED文件,用getSampleFiles()可以拿到文件的全路径,它返回的是个named list,我这里取第4个文件来演示。annotatePeak的输入也可以是GRanges对象,你如果用R做peak calling的话,直接就可以衔接上ChIPseeker了。 require(ChIPseeke

生信小博士的博客 1590

DirectByteBuffer内存释放

我们已经知道,在网络编程中,为了避免频繁的在用户空间与内核空间拷贝数据,通常会直接从内核空间中申请内存,存放数据,在Java中,把内核空间的内存称之为直接内存,nio包中的ByteBuffer的allocateDirect方法,就是帮助我们申请直接内存的,代码如下所示: public static ByteBuffer allocateDirect(int capacity) { return new DirectByteBuffer(capacity); } 在上述代码片段中,返回的是一个DirectBy

JavaEdge全是干货的技术号 1985

D2D与C2C高速互联技术对比:从封装到性能的全面解析

本文全面解析了Die-to-Die(D2D)与Chip-to-Chip(C2C)高速互联技术的差异,从封装形式、传输距离到性能指标进行深度对比。D2D技术在带宽、延迟和能效方面具有显著优势,适用于高性能计算和AI加速;而C2C技术则更适合车载电子系统等长距离传输场景。文章还探讨了UCIe标准化趋势,并提供了技术选型的实用建议。

weixin_29197051的博客 560

从Protocol到硬件控制:揭秘高通UEFI中ABL与XBL的协作机制

本文深入解析了高通UEFI架构中ABL与XBL的协作机制,重点探讨了Protocol通信在硬件控制中的关键作用。通过对比传统GPIO控制方式,揭示了Protocol架构在安全性、可维护性和灵活性方面的优势,并提供了关机充电场景的实战案例分析及调试技巧。

weixin_29185199的博客 431

深入理解DirectByteBuffer

https://www.cnblogs.com/yunxitalk/p/8909040.html https://blog.youkuaiyun.com/bingxuesiyang/article/details/105527220 介绍 最近在工作中使用到了DirectBuffer来进行临时数据的存放,由于使用的是堆外内存,省去了数据到内核的拷贝,因此效率比用ByteBuffer要高不少。之前看过许多介绍DirectBuffer的文章,在这里从源码的角度上来看一下DirectBuffer的原理。 ...

yygr的博客 1233

ICC2: pin shape不在track上引起的drc如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 436

【Java8源码分析】NIO包-Buffer类:内存映射文件DirectByteBuffer与MappedByteBuffer(二)

转载请注明出处:http://blog.youkuaiyun.com/linxdcn/article/details/72896616

linxd 7415

【YOLOv8科研级优化】基于YOLOv9的GELAN模块重构C2f结构,实现精度与效率的同步提升

打开确保模型解析器能识别GELANBlock模块。通过将YOLOv9的GELAN模块集成到YOLOv8的C2f模块中,我们实现了一个“强特征表达+高效计算”的目标检测模型。这个改进不仅在工程上能提升复杂场景下的检测效果,更在科研上提供了“多分支特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的改进中,帮你在论文中打造独特的研究点。

know_F0727的博客 204

电压跟随器在ADC采样电路中的作用分析

电压跟随器在ADC采集系统中扮演关键角色,它能解决分压电路因ADC输入阻抗导致的电压误差问题。通过运放构成的电压跟随器可隔离信号源与负载,保证采样精度,尤其适用于高阻抗传感器或高速采样场景。工程应用中需注意运放带宽、轨对轨输出能力及抗干扰设计。合理使用电压跟随器能显著提升信号完整性,在复杂电子系统中成为不可或缺的"信号桥梁。

硬核科技 659

【Java核心-基础】DirectBuffer 和 MappedByteBuffer

. 简述 Java NIO 中提供了 DirectBuffer、MappedByteBuffer 以提高IO效率。 DirectBuffer DirectBuffer 占用的是 堆外内存。JVM 会在 DirectBuffer 上直接使用 “本地IO操作”(Native I/O Operations)。 Buffer 的地址对“本地IO操作”非常关键。所以在操作 堆...

一个被IT搞的 1822

cesium 实现经纬线绘制和经纬度标注

废话不对数直接上线效果图及代码 1.效果图 2.实现代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=

一碗老面的博客 2570

DirectByteBuffer 超深度全解析(全网最细,含底层原理 + 源码 + 避坑)

✅ 优点(全部围绕高性能)零拷贝 IO:内核可直接访问堆外内存,无内存拷贝,是网络 / 文件 IO 的极致性能选择;无 GC 移动风险:堆内存的对象在 GC 时会被压缩 / 移动,而堆外内存不受 GC 影响,地址固定;内存不受堆大小限制:堆外内存的上限是-XX:MaxDirectMemorySize,可以突破 JVM 堆的限制,适合存储大文件 / 大二进制数据;线程安全友好:堆外内存地址固定,多个线程共享时无需考虑 GC 移动的问题。✅ 缺点(全部围绕易用性和风险)

Adversity reveals genius; fortune conceals it. 853

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java nio 内存过大 限制_案例实战(三)Jetty 服务器的 NIO 机制是如何导致堆外内存溢出的...

案例发生现场有一天突然收到线上的一个报警:某台机器部署的一个服务突然之间就不可以访问了。此时第一反应当然是立马登录上机器去看一下日志,因为服务挂掉,很可能是OOM导致的崩溃,当然也可能是其他原因导致的问题。这个时候在机器的日志中发现了如下的一些信息:nio handle failed java.lang.OutOfMemoryError: Direct buffer memoryat org.ec...

weixin_36487107的博客 736

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NIO三板斧之Buffer,提升程序运行效率的双刃剑

JAVA的GC机制使得内存使用非常的方便,但是,其实内存从来都不简单。NIO虽然还是更多的基于JVM的堆内内存进行构建,但是NIO中也提供了对于堆外内存的完整使用机制。GC是把双刃剑,简化了应用编程,却不可避免的带来了性能的损耗,所以,在很多追求性能极致的场景,都会频繁的使用堆外内存。有兴趣可以去跟踪下RocketMQ基于DirectBuffer来管理存盘文件的源码。下一节,将再来整理最后的这个Channel。文章分享就到这里了,了解更多Java知识可关注微信公众号“老周扯IT”https。...

weixin_51702416的博客 606

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

堆外内存释放

结论:堆外内存只有在fullgc的时候才能够回收掉。 先看普通对象回收,这里设置jvm参数,便于触发和观察gc -verbose:gc -XX:+PrintGCDetails -server -Xms20m -Xmx20m 实例代码 a 结果

xiaoxishuaidaile的博客 970

JVM源码分析之堆外内存完全解读

JVM源码分析之堆外内存完全解读广义的堆外内存说到堆外内存,那大家肯定想到堆内内存,这也是我们大家接触最多的,我们在jvm参数里通常设置-Xmx来指定我们的堆的最大值,不过这还不是我们理解的Java堆,-Xmx的值是新生代和老生代的和的最大值,我们在jvm参数里通常还会加一个参数-XX:M

cyhe2010的博客 434

Netty之Java堆外内存扫盲贴

Java的堆外内存本来是高贵而神秘的东西,只在一些缓存方案的收费企业版里出现。但自从用了Netty,就变成了天天打交道的事情,毕竟堆外内存能减少IO时的内存复制,不需要堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中;而且也没了烦人的GC。 好在,Netty所用的堆外内存只是Java NIO的 DirectByteBuffer类,通读一次很快。还有一些sun.misc.*的类

zbuger的博客 2184

Java堆外内存增长问题排查Case

Java堆外内存增长问题排查Case 最近排查一个线上java服务常驻内存异常高的问题,大概现象是:java堆Xmx配置了8G,但运行一段时间后常驻内存RES从5G逐渐增长到13G #补图#,导致机器开始swap从而服务整体变慢。 由于Xmx只配置了8G但RES常驻内存达到了13G,多出了5G堆外内存,经验上判断这里超出太多不太正常。 前情提要–JVM内存模型 开始逐步对堆外内存进行排查,首...

老猿说说专栏 8231

Java NIO Buffer:DirectByteBuffer堆外内存回收的Cleaner机制详解

Java 的四种引用(强、软、弱、虚)里,虚引用是最神秘的。你通过虚引用根本拿不到对象实例。当对象被 GC 回收时,系统会把这个虚引用加入到一个引用队列(ReferenceQueue)中,给你一个“收尸”的通知。关于和Cleaner虚引用是核心Cleaner基于虚引用,只有当 Java 堆内的对象被 GC 回收时,堆外内存才会被释放。时间差是杀手:堆内对象小,堆外内存大,GC 不敏感导致堆外先爆。慎用 DisableExplicitGC:在大量使用 NIO 的场景下,禁用等于自杀。请改用。

m0_69632475的博客 434

java堆外内存简介

Java的堆外内存本来是高贵而神秘的东西,只在一些缓存方案的收费企业版里出现。但自从用了Netty,就变成了天天打交道的事情,毕竟堆外内存能减少IO时的内存复制,不需要堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中;而且也没了烦人的GC。 好在,Netty所用的堆外内存只是Java NIO的 DirectByteBuffer类,通读一次很快。还有一些sun.misc.*的类

空杯心态_虚怀若谷 355

Java函数内存溢出频发(JVM堆外内存泄漏深度溯源)

快速定位Java函数内存溢出根因,聚焦JVM堆外内存泄漏深度溯源。结合Serverless场景,提供Java函数计算优化实战方案,涵盖Netty缓冲区管理、Native内存监控与GraalVM裁剪技巧,显著降低OOM风险。值得收藏

CodePulse的博客 423

Java堆外内存泄漏难题破解(一线专家实战经验总结)

解决Java堆外内存泄漏难题,提升系统稳定性。结合实际应用场景,深入剖析Java外部内存安全管理机制,介绍DirectByteBuffer监控、显式资源回收与JVM参数调优等核心方法,有效规避内存溢出风险,保障高并发服务可靠运行,值得收藏。

LiteCode的博客 1109

一次由JVM堆外内存(Off-Heap Memory)泄漏引发的故障

本例中,因未显式调用`Cleaner`释放DirectByteBuffer,导致内存持续累积。在Java应用中,JVM堆内存管理备受关注,但堆外内存(Off-Heap Memory)泄漏却常被忽视。传统JVM监控工具(如VisualVM)仅关注堆内存,堆外内存成为盲区。最终通过`pmap`或`Native Memory Tracking`(NMT)工具,才定位到泄漏点。**JVM堆外内存泄漏之殇****堆外内存泄漏根源****性能与安全的平衡****监控盲区与误判****修复与预防策略**

dtiezl_711的博客 211
上一篇: jvm堆外直接内存实现高性能接入层
下一篇: 接入层高性能缓存技术nginx+redis利器
ChainCode
ChainCode 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄11年 115粉丝 51原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值