Java-NIO(三):直接缓冲区与非直接缓冲区

  • 直接缓冲区与非直接缓冲区的概念:

1)非直接缓冲区:通过

static ByteBuffer allocate(int capacity)

创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容),缓冲区的内容驻留在JVM内,因此销毁容易,但是占用JVM内存开销,处理过程中有复制操作。

非直接缓冲区写入步骤:

1.创建一个临时的直接ByteBuffer对象。
2.将非直接缓冲区的内容复制到临时缓冲中。
3.使用临时缓冲区执行低层次I/O操作。
4.临时缓冲区对象离开作用域,并最终成为被回收的无用数据。

2)直接缓冲区    :通过

static ByteBuffer allocateDirect(int capacity)

创建的缓冲区,在JVM内存外开辟内存,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会避免将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容),缓冲区的内容驻留在物理内存内,会少一次复制过程,如果需要循环使用缓冲区,用直接缓冲区可以很大地提高性能。虽然直接缓冲区使JVM可以进行高效的I/O操作,但它使用的内存是操作系统分配的,绕过了JVM堆栈,建立和销毁比堆栈上的缓冲区要更大的开销。

  • 直接缓冲区与非直接缓冲区的区别:
  1. 字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。
  2. 直接字节缓冲区可以通过调用此类的 allocateDirect() 工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。
  3. 直接字节缓冲区还可以通过 FileChannel 的 map() 方法 将文件区域直接映射到内存中来创建。该方法返回MappedByteBuffer 。 Java 平台的实现有助于通过 JNI 从本机代码创建直接字节缓冲区。如果以上这些缓冲区中的某个缓冲区实例指的是不可访问的内存区域,则试图访问该区域不会更改该缓冲区的内容,并且将会在访问期间或稍后的某个时间导致抛出不确定的异常。
  4. 字节缓冲区是直接缓冲区还是非直接缓冲区可通过调用其 isDirect() 方法来确定。提供此方法是为了能够在性能关键型代码中执行显式缓冲区管理。
  • 直接缓冲区与非直接缓冲区区别图形示意:

 

转载于:https://www.cnblogs.com/yy3b2007com/p/7262453.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring IOC扫描器与注册器

核心接口: 组件扫描器: 开发过程中,需要根据需求加载必要的bean,排除指定bean 设定组件扫描加载过滤器: 名称:ComponentScan 类型:类注解 位置:类定义上方 作用:设置…

Spring AOP切入点与通知XML类型

AOP: AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构AOP弥补了OOP的不足,基于OOP基础之上进行横向开发 uOOP规定程序开发以类为主体模型,一切围绕对…

给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

【问题】 关于iOS/iPhone中的文件选择对话框,用于用户去选择图片等文件 过程中,问题转换为,需要给当前iOS项目中,添加一个图片。 类似于Windows开发中的资源文件,其中图片文件属于资源的一种。 并且,接着可…

AOP底层原理与注解配置详解

注解开发AOP制作步骤: 在XML格式基础上 导入坐标(伴随spring-context坐标导入已经依赖导入完成开启AOP注解支持配置切面Aspect定义专用的切入点方法,并配置切入点Pointcut为通知方法配置通知类型及对应切入点Before 注解开发AOP注意事项&am…

MacOS Apple M1 安装ARM架构的JDK及动态切换版本

JDK下载安装: 咱就是说,ARM版本的JDK就是一个字,真特么快,想变快吗,赶紧下载叭!! 1、下载地址:https://www.azul.com/downloads/?packagejdk 筛选一下MacOS下ARM架构的JDK版本&…

梯度下降和EM算法,kmeans的em推导

I. 牛顿迭代法给定一个复杂的非线性函数f(x),希望求它的最小值,我们一般可以这样做,假定它足够光滑,那么它的最小值也就是它的极小值点,满足f′(x0)0,然后可以转化为求方程f′(x)0的根了。非线性方程的根我…

Spring事务详解与使用

Spring事务核心对象 J2EE开发使用分层设计的思想进行,对于简单的业务层转调数据层的单一操作,事务开启在业务层或者数据层并无太大差别,当业务中包含多个数据层的调用时,需要在业务层开启事务,对数据层中多个操作进行组…

黑马程序员博学谷Java就业班课程

1、资料全无加密,可任意试看 2、内容包括课程资料 地址:https://www.boxuegu.com/class/outline-1112.html

设计模式一の设计模式详解

一、设计模式定义 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;…

Spring模板对象

Spring模块对象: 把共性的方法抽取出来固定为一个模板,后续再操作只需要填充内容即可。 比如:淘宝每次买东西都要填写地址,只是每次买的东西不一样,所以可以做一个默认地址,每次买东西都要去选商品就行了,不…

SpringMVC入门案例

SpringMVC 概述: SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 三层架构 表现层:负责数据展示业务层:负责业务处理数据层:负责数据操作 MVC(Model View Controller):一种用于设计创建…

SpringMVC请求中的普通、POJO、数组集合类型传参与类转换器

SpringMVC将传递的参数封装到处理器方法的形参中,达到快速访问参数的目的。 普通类型参数传参 参数名与处理器方法形参名保持一致 访问URL: http://localhost/requestParam1?nameitzhuzhu&age14 RequestMapping("/requestParam1")publi…

SpringMVC-HandlerInterceptor拦截器的使用与参数详解

拦截器概念: 拦截器( Interceptor)是一种动态拦截方法调用的机制,请求处理过程解析核心原理: AOP思想拦截器链:多个拦截器按照一定的顺序,对原始被调用功能进行增强 作用: 在指定的…

使用FindBugs-IDEA插件找到代码中潜在的问题

另一篇使用文档,参照:https://www.cnblogs.com/huaxingtianxia/p/6703315.html 我们通常都会在APP上线之后,发现各种错误,尤其是空指针异常,这些错误对于用户体验来说是非常不好的,但其实大部分的问题,我们都能够提前发现. 在编写代码的过程中,可能不会时…

霍炬:再谈百度:KPI、无人机,以及一个必须给父母看的案例

霍炬:再谈百度:KPI、无人机,以及一个必须给父母看的案例 作者:霍炬。 原文链接:http://www.donews.com/idonews/article/8147.shtm没想到我之前的一篇关于百度的文章引起了这么大的反馈。非常多朋友称赞我写的好&…

使用SpringMVC模拟文件上传与下载案例

文件上传下载 SpringMVC封装了Tomcat的上传文件功能 MultipartResolver接口 MultipartResolver接口定义了文件上传过程中的相关操作,并对通用性操作进行了封装MultipartResolver接口底层实现类CommonsMultipartResovlerCommonsMultipartResovler并未自主实现文件上…

JSR表单校验框架

表单校验的重要性: 表单校验保障了数据有效性、安全性 不适用表单检验数据可以随意输入,导致错误的结果。后端表单校验的重要性,比如输入框采集成绩,如果前端做了检验,但是用户比较牛逼,他在地址栏上直接加…

使用Phantom omni力反馈设备控制机器人

传统的工业机器人普遍采用电机 、齿轮减速器 、关节轴三者直接连接的传动机构,这种机构要求电机与减速器安装在机械臂关节附近,其缺点是对于多关节机械臂,下一级关节的电机与减速器等驱动装置成为上一级关节的额外负载 。这一额外负载带来的负…

Go_配置系统环境MacOS(M1)

在MacOS下和JDK一样,配不配环境其实MacOS都是可以检测的到的,安装好以后直接输入go version是一样可以的,因为都是使用开发工具的,在开发工具里配置的话是样的,如果有习惯的话就配置一下吧 下载安装及配置环境&#xf…

Go_数据类型

数据类型: 计算机存储设备最小信息单位是位(bit),最小的存储单元是字节(byte),占用字节的不同,所表示能存储的数据长度不同。数据类型用来说明数据的数据的结构,便于后面…