了解Java缓冲池

了解Java缓冲池

缓冲池空间位于垃圾收集器管理的内存之外。 这是分配本地堆外内存的一种方法。 使用缓冲池有什么好处? 为了回答这个问题,让我们首先了解什么是字节缓冲区。

字节缓冲区

非直接缓冲区

ByteBuffer类附带了java.nio包。 它允许我们分配直接和非直接字节缓冲区。 非直接字节缓冲区没有什么特别的-它们是由ByteBuffer.allocate()ByteBuffer.wrap()工厂方法创建的HeapByteBuffer的实现。 就像该类的名称所暗示的那样,它们是堆上字节缓冲区。 那么,在Java堆空间上分配所有缓冲区会不会更容易? 为什么有人需要在本机内存中分配某些内容? 要回答这个问题,我们需要了解操作系统如何执行I / O操作。 任何读或写指令都在连续的字节序列存储区上执行。 那么byte[]是否在堆上占据了连续的空间? 从技术上讲这很有意义,但是JVM规范没有这样的保证。 更有趣的是, 规范甚至不能保证堆空间本身是连续的! 尽管JVM不太可能将一维原语数组放置在内存中的不同位置,但是Java堆空间中的字节数组不能直接用于本机I / O操作。 必须在每次I / O之前将其复制到本机内存,这当然会导致明显的低效率。 因此,引入了直接缓冲区。

直接缓冲

直接缓冲区是与Java共享的本机内存块,您可以从中执行直接读取。 可以使用ByteBuffer.allocateDirect()工厂方法创建DirectByteBuffer的实例。 字节缓冲区是执行I / O操作的最有效方法,因此,它们在许多库和框架中使用,例如在Netty中。

内存映射缓冲区

直接字节缓冲区也可以通过将文件区域直接映射到内存中来创建。 换句话说,我们可以将文件的区域加载到可以稍后访问的特定本机内存区域。 您可以想象,如果我们需要多次读取文件内容,它可以显着提高性能。 借助内存映射文件,后续读取将使用内存中文件的内容,而不是每次需要时都从光盘加载数据。 MappedByteBuffer可以通过创建FileChannel.map()方法。

内存映射文件的另一个优点是,操作系统可以在系统关闭时直接将缓冲区刷新到磁盘。 而且,操作系统可以锁定文件的映射部分,使其免受计算机上其他进程的影响。

分配很贵

直接缓冲区的问题之一是分配它们很昂贵。 无论缓冲区的大小如何,调用ByteBuffer.allocateDirect()都是一个相对较慢的操作。 因此,对于大型和长寿命的缓冲区使用直接缓冲区,或者创建一个大型缓冲区,按需分割部分,并在不再需要它们时将它们返回以重新使用,效率更高。 当切片的大小不总是相同时,可能会出现切片问题。 当分配和释放不同大小的对象时,初始的大字节缓冲区可能会变得碎片化。 与Java堆不同,直接字节缓冲区无法压缩,因为它不是垃圾收集器的目标。

监视缓冲池的使用

如果您对应用程序使用的直接或映射的字节缓冲区的数量感兴趣,则可以使用许多工具(包括VisualVM(带有BufferMonitor插件)和FusionReactor)轻松监视它们。 Java将根据需要增加缓冲池,因此“已使用的直接内存”涵盖了下图的“直接容量”这一事实,这意味着到目前为止分配的所有缓冲内存都在使用中。

请注意–您可以使用-XX:MaxDirectMemorySize=N标志来限制应用程序可以分配的直接字节缓冲区空间量。 尽管这是可能的,但是您将需要一个很好的理由。

翻译自: https://www.javacodegeeks.com/2018/03/understanding-java-buffer-pool.html

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

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

相关文章

java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner

在为什么阿里巴巴不建议在for循环中使用””进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点。其中还有一个重要的拼接方式我没有介绍,那就是Java 8中提供的StringJoiner ,本文就来介绍一下这个字符串拼接…

doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)

在日常工作中我们经常会与数组打交道,因此需要熟练掌握数组操作的相关方法,ES6中关于数组的操作,又给我们带来了哪些惊喜呢,Array数组操作又添加了哪些新方法?本篇文章将从以下几个方面进行介绍:Array.from…

No module named ‘__main__.common‘; ‘__main__‘ is not a package

今天在调通代码时遇到一个难缠的bug,源代码如下: from .common import _FLOATX, _EPSILON结果报错: 问题原因: 也就是说,这是相对导入,只有在父模块在当前运行环境中被导入过才能用。 这揭示了报错的缘由&#xff0…

ValueError( Shape(4, ?, 1, 20) and () are incompatible

报错: 解决: 将文件中的return tf.concat(axis, tensors) 改为:return tf.concat(tensors, axis)问题完美解决

adadelta算法_对C++用户比较友好的机器学习算法库

由于疫情影响,这几天在家学习编程,整理了基于c语言的机器学习算法库。目前大部分机器学习库都是面向pyhton语言的,尽管很python包的底层语言是c,但c用户使用起来很麻烦,这里整理了一些对c比较优化的机器学习算法库&…

不解析,使用解析对象

将面向对象的后端与外部系统集成的传统方式是通过数据传输对象 ,这些对象在外出之前先序列化为JSON,然后在返回时反序列化。 这种方法很流行,而且是错误的。 序列化部分应该由打印机代替,我在前面已经解释过。 这是我对反序列化的…

yaml报错TypeError: load() missing 1 required positional argument: ‘Loader‘

添加一下命令即可: 我的操作: return yaml.load(config)改为 return yaml.full_load(config)问题完美解决

3d制作中需要注意的问题_珠宝首饰工艺篇-戒指3D造型设计制作注意要点

1、戒指的常规手寸数据和戒指外围周长计算公式应用参考如下图:戒指手寸内直径大小说明图1、戒指手寸规格有14号、15号、16号、17号、18号、19号、20号、,但是从开发角度来说比较常见规格是17号18号19号这几种规格比较多,那我们电脑3D建模的时…

微信推送封面尺寸_连封面图都搞不明白,做什么新时代的新媒体人?

嘿,胖友们大家好呀,我是三儿。又是精(bu)神(xiang)满(shang)满(ban)的周一啦,胖友们准备好开始迎接新的一周了吗!为了迎接这个崭新的周一,三儿特意为你们准备的一些实用的小工具教学,帮助你们快速的完成工作…

latex学习篇【一】论文中的图片技巧QA

第一篇论文总算收尾了,整理一波latex写论文的Q&A。 LATEX专栏第一篇:在Latex模板中引入各种图片的问题。 工具:overleaf网站:https://www.overleaf.com/project/60e9ceb20f8db14efa31dc80在overleaf上面插入图片什么形式最好…

LATEX学习篇【二】:论文中的公式技巧QA

写论文免不了写好多好多公式,众所周知啊latex的公式是很难编辑的,有没有简便一点的办法呢?有的,让我们继续读下去吧! 写公式时会用到的一些奇奇怪怪的符号大全(来自百度) 2. 写公式好用的工具…

使用RabbitMQ的SpringBoot消息传递

RabbitMQ是流行的消息代理解决方案之一,并提供可用于各种编程语言的客户端库,包括Java,Scala,.NET,Go,Python,Ruby,PHP等。在本教程中,我们将学习如何使用RabbitMQ消息代…

1.0jpa 2.0_在JPA 2.1中使用@Convert正确完成映射枚举

1.0jpa 2.0如果您曾经在JPA中使用过Java枚举,那么您肯定会意识到它们的局限性和陷阱。 使用enum作为Entity的属性通常是一个很好的选择,但是2.1之前的JPA不能很好地处理它们。 它给了您2 1个选择: 托肖夫达林 Enumerated(EnumType.ORDINAL…

矩形脉冲信号的_IQ信号的解调学习

前面的文章学习了IQ的调制,本文主要讨论IQ的解调过程。调制波形回顾IQ的shifted DQPSK的调制波形总结如下。IQ的星图映射波形每个symbol有256个采样点,这里可以用单位脉冲或者矩形脉冲。如果只看256个symbol的话:IQ经过FIR滤波之后&#xff0…

Spring Data MongoDB教程

在当今世界,尽快启动并运行应用程序非常重要。 该应用程序还应该易于开发和维护。 Spring是这样的框架,它提供了与许多不同框架的集成的简便性,这使得使用Spring开发应用程序变得容易。 一种这样的集成是Spring与MongoDB的集成。 1.简介 在…

arm 交叉编译找不到so_嵌入式杂谈之交叉编译

这次扯一下嵌入式开发过程中经常用到的交叉编译器,虽说在之前的文章也提到过这个问题,不过上次是着重介绍为什么使用交叉编译器(主要是为了劝服自己从单片机的思想中脱离出来,慢慢的接受嵌入式Linux开发的一些约定俗成的工具与方法)&#xff…

Java 10将如何改变您的编码方式

突出显示Java 10中新的Java局部变量类型推断功能 早在2016年,Java社区就掀起了新的JDK增强提案(JEP): JEP 286 。 现在,两年后,局部变量类型推断可以说是Java 10中最值得注意的功能。这是Java语言开发人员…

中兴zxr10路由器重启命令_蒲公英路由器刷第三方固件(一)

蒲公英路由器是由上海贝锐信息科技股份有限公司(oray)在2015年10月14日推出的一款路由器。它是一款采用VPC[3]技术实现智能组网的路由器。2台或多台使用,无需公网IP,能将异地局域网通过蒲公英组建成一个网络。这次刷固件的教程为蒲公英路由器x3/x3pro刷第…

Spring Cloud Netflix尤里卡

本教程是关于Spring云Netflix Eureka的。 在这里,我们将创建eureka发现服务器和微服务,这些服务本身将注册到发现服务器和使用netflix客户端API的客户端中,以使用示例示例来发现服务并使用该服务公开的微服务。因此,我们将开发每个…

掘进循环作业图表_Word版本。煤矿安全生产标准化评分方法(2020)8.4 掘进

注:以下内容来自于网络,若有侵权请联系QQ3609400292进行删除。煤矿安全生产标准化管理体系基本要求及评分方法(试行)8.4 掘 进一、工作要求(风险管控)1.生产组织(1)煤巷、半煤岩巷宜采用综合机械化掘进,综合机械化程度不低于50%,并持续提…