jvm堆外直接内存实现高性能接入层

基于SpringBoot+Vue的公司考勤管理系统 为什么选择我博主是优快云毕设辅导博客第一人兼开派祖师爷、博主本身从事开发软件开发、有丰富的编程能力和水平。专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流和合作。 阅读详情

       接入层接受app的请求,解包数据重新封装数据包,把app数据包做为包体,同时再加上接入层的包头数据,根据app数据包头的协议号转发到后端业务服务器。
所有app端的请求都先经过接入层,因此接入层的性能是至关重要。

       为了性能上的保证,使用到netty的PooledDirectByteBuf,顾名思义就是池化的堆外直接内存,堆外直接内存就是jvm堆以外申请的内存,这里为什么考虑用堆外内存?看下图就明白了:
 
       上图中是没有使用堆外内存的例子,运行在内核态的socket接收到的数据放在堆外直接内存中,java进程要得到这份数据,选 通过jvm把数据复制到jvm的堆内存,java进程发送数据时,jvm会把堆内存数据复制到堆外直接内存,再用socket发送堆外直接内存数据。
使用了PooledDirectByteBuf后如下:
 

        堆外直接内存减少jvm的GC造成的停顿时间,但是创建和销毁的开销较大,PooledDirectByteBuf对堆外直接内存进行池化,先申请一大块的堆外内存,创建PooledDirectByteBuf时从池子里拿到一块空间写入数据,使用完后再把空间归还。
        堆外直接内存在java里用DirectByteBuffer,netty的PooledDirectByteBuf是基于DirectByteBuffer进行池化封装,DirectByteBuffer的父类是MappedByteBuffer,MappedByteBuffer源码里注释有一行描述A direct byte buffer whose content is a memory-mapped region of a file,内容是个内存映射文件,内存映射文件,是由一个文件到一块内存的映射。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。两个或多个进程映射同一文件映射对象的视图,即它们在共享同一物理存储页。这样,当一个进程向内存映射文件的一个视图写入数据时,其他的进程立即在自己的视图中看到变化

Python自动化办公:5分钟搞定钉钉群文件自动发送(附完整代码) 本文详细介绍了如何利用Python实现钉钉群文件的自动化发送。通过结合钉钉企业内部应用与群机器人API,构建了包含智能令牌管理、文件上传与消息发送的完整工作流。文章提供了可直接复用的完整代码,并分享了定时任务、目录监听等进阶实战方案,帮助职场人士高效解决重复性文件发送难题,实现办公自动化。 阅读详情

相关推荐

Solidworks曲面建模学习(二)——3D草图

本文主要是演示有一些零件在solidworks中通过3D草来绘制会更加方便。

东东不熬夜的博客 9509

【JVM】详解直接内存

下面是 《深入理解 Java 虚拟机 第三版》2.2.7 小节 关于 Java 直接内存的描述。直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致异常出现,所以我们放到这里一起讲解。在 JDK 1.4 中新加入了类,引入了一种基于通道(Channel)与缓冲区(Buffer)的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里面的。

沉迷写代码的程序猿的博客 3783

使用循环神经网络预测温度

简介 本文以天气时间序列数据集为例,讨论如何使用深度学习模型预测未来天气温度。 使用的是由德国耶拿马克思普朗克生物地球化学研究所的气象站记录。 数据每10分钟记录一次,共记录14种不同的量,如气温、气压、湿度、风向等,原始数据可追溯到2003年,本例只使用2009-2016年的数据。 数据 下载并解压数据略。 加载数据: data_dir = r'E:\practice\tf2\temperature' fname = os.path.join(data_dir, 'jena_climate_2009_

guotianqing的博客 5282

JVM基础篇-直接内存

JVM基础篇-直接内存

冰点契约的博客 2685

龙虾 Skill 技能库|OpenClaw+Hermes 全集成 一键调用所有 AI 技能

龙虾 Skill 技能库、OpenClaw、Hermes Agent、AI 技能集成、本地 AI 自动化、办公工具、数字员工

weixin_42219287的博客 625

【QT+PCL】串口读取单线激光雷达数据并在QVtkWidget组件中实时刷新(一)

(本文主要记录开发过程以及遇到的困难及解决方式)

2301_76329543的博客 3068

JVM - 直接内存

直接存在内存屏障,所以进行数据的交互时就会进行来回复制。换而言之就是需要由用户态切换到内核态,内核态中需要同时维护两份重复数据,这样带来的额外性能开销是非常大的。等参数信息,但经常忽略掉直接内存,使得各个内存区域总和大于物理内存限制(包括物理和操作系统级的限制),从而导致动态进行扩展时出现。避免了不必要的性能开销。也正是因为直接内存不是虚拟机运行时数据区的一部分,直接内存不受。堆内存大小的限制,但是它还是会受到本机总内存(包括物理内存,...

m0_67401382的博客 560

Plant Simulation智能行车/天车/起重机建模(1)-基本对象说明

摘要: MultiPortalCrane(多门式起重机)是一种灵活物料搬运设备,适用于造船、钢铁等行业,支持零件预组装、钢板/钢卷智能料场管理及设备装卸。其特点包括: 多门架协同:支持同轨道多门架运行,内置防撞检测; 模块化控制:可独立调节门架、小车及吊钩的速度、加速度和悬臂长度; 多样化搬运:通过目标位置设置或连接器实现零件运输; 故障与统计:可配置MTTR和可用率,实时监控各部件状态。 通过对话框可自定义轨道尺寸、门架数量及运动参数,并支持编程调用(如getPortals方法)。适用于需高精度定位和协同

qq_31964455的博客 315

【JVM基础06】——组成-直接内存详解

直接内存详解

weixin_44382896的博客 3501

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1421

STM32开发 -- LIS3DH三轴加速度计开发详解

这次要讲一下LIS3DH三轴加速度计的开发使用,之前是有讲过 MPU6050开发 的,但当时是在Linux下做的。额,还是个半成品,哈哈。现在手边有STM32的开发板,可以实实在在的来实现以下卡尔曼滤波了。 一、LIS3DH初识 依照惯例,先看一下手册,大致先了解一下,LIS3DH是什么模块。 下载:LIS3DH datasheet 1、描述 LIS3DH是一款超低功耗高性能三轴线性加速度计,属于...

不积跬步,无以至千里 2万+

jvm直接内存

直接内存是 Java 中一种基于操作系统内存的区域,直接分配在操作系统内存中,而不是在 JVM 的堆中。直接内存不受 JVM 垃圾回收机制的管理,因此分配和释放都需要由程序员手动完成。通过操作系统提供的malloc等接口分配内存区域。Java 的java.nio包引入了ByteBuffer类,支持直接内存分配,用于提升 I/O 操作性能。直接内存是 JVM 内存模型中的重要组成部分,主要用于提升 I/O 性能和减少内存拷贝。

Flying_Fish_roe的博客 1958

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM直接内存详解

磁盘上的大文件直接转到内存中以便高速读写。

fengdongnan的博客 1695

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【JVM篇06】:JVM的直接内存及其与nio提升io效率的联系详解

本文深入解析JVM直接内存(Direct Memory)及其在NIO性能优化中的作用。直接内存是堆外内存,由操作系统管理,通过ByteBuffer.allocateDirect()申请,不受JVM堆大小限制。其核心优势在于减少数据拷贝:相比堆内存需要两次CPU拷贝(内核缓冲区↔JVM堆),直接内存只需一次拷贝(内核缓冲区↔直接内存),显著提升I/O效率。但直接内存也存在分配回收成本高、内存管理复杂等缺点,适合大容量、长生命周期的I/O操作场景。文章通过对比数据流转路径,阐明了NIO性能提升的本质原因。

lyh2004_08的博客 1372

JVM的直接内存

1、直接内存 直接内存不是虚拟机运行时数据区的一部分,也不是《java虚拟机规范》中定义的内存区域 直接内存是java堆外的、直接向系统申请的内存空间 简单理解:java.process memory= java heap+native memory 示例代码: /** * IO NIO (New IO / Non-Blocking IO) * byte[] / char[] Buffer * Stream Channel

sober 1155

JVM内存结构笔记05-直接内存

直接内存是一种特殊的内存缓冲区,并不在 Java 堆或方法区中分配的,而是通过 JNI 的方式在本地内存上分配的。直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致 OutOfMemoryError 错误出现。

weixin_46425661的博客 1075

JVM篇:直接内存

直接内存并不是JVM的内存结构,直接内存是操作系统的内存,Java本身并不能对操作系统的内存进行操作,而是通过调用本地方法。直接内存常用于NIO作为缓冲区存在,分配成本较高但是读写性能好,并且不受JVM内存回收管理。

zmbwcx的博客 1908

jvm中的直接内存

在 Java 中,直接内存不是堆内存,它属于堆外内存(Off-Heap),由操作系统管理。这就是直接内存溢出。

2201_75450136的博客 933

【从零学习JVM|第七篇】快速了解直接内存

Java直接内存是JVM堆外的操作系统内存区域,通过ByteBuffer操作,核心优势是零拷贝和减轻GC压力。它避免了I/O操作时的数据复制,提升大文件传输性能,并减少堆内存占用。但需手动管理释放,否则易内存泄漏,且分配成本较高。使用时需设置内存上限(MaxDirectMemorySize),评估场景合理使用。直接内存适合高性能I/O和大内存管理,但需谨慎管理生命周期。

uybji的博客 1156

JVM 虚拟机篇 - 06:解读直接内存

直接内存并不是 JVM 运行时数据区的传统组成部分,但它与 JVM 的内存管理和运行有着紧密的联系。直接内存允许 Java 应用程序直接访问操作系统的内存空间,这意味着在数据交互过程中,数据可以绕过 Java 堆,在操作系统内存和 Java 应用程序之间直接传输。这种机制为特定的高性能场景提供了独特的优势。

m0_57836225的博客 779

JVM中的直接内存

使用直接内存的场景:大文件处理(>100MB的文件读写)高性能网络通信(Netty、gRPC等框架)内存映射文件(随机访问大文件)与本地库交互(需要共享内存)大数据处理(Spark、Flink等计算框架)高频I/O操作(数据库连接池、缓存系统)不使用直接内存的场景:小对象频繁创建(使用对象池或堆内存)简单的桌面应用(无需高性能I/O)内存受限环境(直接内存管理复杂)短期运行的程序(分配开销不划算)

ckh20040422的博客 676

JVM-直接内存

与 Java 堆区不同,JVM 直接内存不受 Java 堆大小的限制,而是通过调用本地系统的接口分配内存,这是一种直接与操作系统交互的内存分配方式。JVM 直接内存可以通过 NIO(New。:使用 JVM 直接内存可以直接进行零拷贝的 I/O 操作,避免了数据在 Java 堆和内核空间之间的复制,提高了数据操作效率。:使用 JVM 直接内存需要手动管理,需要在适当的时机释放内存,增加了开发者的工作量和代码的复杂度。:由于直接内存的分配不受 Java 堆大小的限制,分配过多的直接内存可能导致系统资源的耗尽。

程序员朱永胜 257

JVM 虚拟机篇 - 05:深入解析直接内存

在 JVM(Java Virtual Machine)的复杂体系中,直接内存(Direct Memory)是一个特殊且重要的概念。

m0_57836225的博客 589

堆外直接内存实现高性能接入层

接入层接受app的请求,解包数据重新封装数据包,把app数据包做为包体,同时再加上接入层的包头数据,根据app数据包头的协议号转发到后端业务服务器。 所有app端的请求都先经过接入层,因此接入层的性能是至关重要。        为了性能上的保证,使用到netty的PooledDirectByteBuf,顾名思义就是池化的堆外直接内存,堆外直接内存就是jvm堆以外申请的内存,这里为什么考虑用

HyNeverGiveUp的博客 787

Apache Druid历史节点内存优化终极指南:解决JVM堆外与直接内存溢出实战

Apache Druid作为高性能实时分析数据库,其历史节点(Historical Nodes)负责存储和查询历史数据,是集群中的核心组件。然而在处理大规模数据集时,历史节点常面临JVM堆外内存溢出和直接内存泄漏问题,导致服务崩溃或性能急剧下降。本文将从内存模型分析入手,提供一套完整的优化方案,帮助运维人员快速定位并解决内存问题,确保Druid集群稳定运行。 ## Druid历史节点内存模型深度

gitblog_00377的博客 338

Java内存的堆(堆内、堆外)、栈含义理解笔记

Java内存的堆(堆内、堆外)、栈含义理解笔记

Z_Flank的博客 1696
上一篇: 通过redis选主进程
下一篇: 堆外内存DirectByteBuffer剖析
ChainCode
ChainCode 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄11年 115粉丝 51原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值