缓冲池java_了解Java缓冲池

缓冲池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

缓冲池java

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

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

相关文章

什么是合数

合数指自然数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。 合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。与之相对的是质数,而1既不属于质数也不属…

计算机网络应用层笔记--域名系统DNS

域名系统DNS标识因特网上主机的方式主机名IP地址域名系统(DNS)工作过程互联网的域名结构顶级域名国家顶级域名nTLD通用顶级域名gTLD基础结构域名二级域名类别域名行政区域名域名树DNS规定域名服务器域名服务器的层次根域名服务器顶级域名服务器(TLD服务器)权限域名服务器本地域…

protobuf3 自定义option_Protobuf3 语法指南

以前我翻译了 Protobuf2 语法指南,现在 千念飞羽把protobuf3的语法指南也翻译了,我也转载一下,读者可以有个参考。 译文地址是: Protobuf3语言指南。英文原文:Language Guide (proto3)中文出处:Protobuf语言指南[译]Pr…

web.xml.jsf_面向初学者的JSF 2.0教程

web.xml.jsf1.什么是JSF? JSF是Java Server Faces的首字母缩写。 它是一种服务器端处理技术,它允许将服务器端代码嵌入到网页中。 由于可以将服务器端处理和渲染代码嵌入网页本身,因此使项目的整体编码更加简单。 减少文件总数和大小。 JSF包…

0 是什么数

0 是最小的自然数0 是有理数0 既不是正数也不是负数,而是正数和负数的分界点0 是介于 -1 和 1 之间的整数0 不是奇数,而是偶数(一个非正非负的特殊偶数)0 不是质数,也不是合数0 在多位数中起占位作用,如108…

ubuntu下vscode使用cmake编译运行c++配置文件

在gcc/g能编译运行c的情况下,使用cmake编译只需要修改以下两个文件。 launch.json {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version&quo…

r语言mfrow全程_R语言中的色彩_LearningR - SegmentFault 思否

1. 基本颜色1.1 palette()1.1.1 palette的默认颜色palette()## [1] "black" "red" "green3" "blue" "cyan" "magenta" "yellow"## [8] "gray"pie(rep(1,8), colpalette(), border palette()…

java如何避免注释重复_Java 8中的可重复注释

java如何避免注释重复使用Java 8,您可以对声明或类型重复相同的注释。 例如,要注册一个类仅应由特定角色在运行时访问,则可以编写如下内容: Role("admin") Role("manager") public class AccountResource { …

什么是有理数

有理数是整数(正整数、0、负整数)和分数的统称,是整数和分数的集合。 整数也可看做是分母为一的分数。不是有理数的实数称为无理数,即无理数的小数部分是无限不循环的数。 正整数和正分数合称为正有理数,负整数和负分数…

Python中的符号

解释经常在python源码中看到的,->和:等符号。python在函数名或类名首字母用_来表示私有接口(仅供内部使用)。 标注 关联到某个变量、类属性、函数形参或返回值的标签,被约定作为类型提示来使用。 局部变量的标注在运行时不可访问,但全局变量、类属性…

java高可用grpc_GRPC java 分布式调用链跟踪实践

Opentracing基本模型image.png如图,在跟踪链中有以下几个比较重要的数据结构和概念:span:标识一次分布式调用,其自身包含了id,parentId(指向上级Span的id), traceIds,服务名称等重要属性&#x…

jrebel gradle_JRebel适用于Gradle Spring Boot应用程序

jrebel gradle关于如何将JRebel添加到使用Gradle作为构建工具的Spring Boot应用程序中,有一些文档 。 它是基本的,但是效果很好。 您所要做的就是在build.gradle中添加几行: if (project.hasProperty(rebelAgent)) {bootRun.jvmArgs rebel…

vim 的寄存器/剪贴板

文章目录 一、查看寄存器查看所有的寄存器查看指定的寄存器二、各种寄存器介绍无名寄存器(默认寄存器)命名寄存器复制专用寄存器逐级临时缓存寄存器。行内删除寄存器黑洞寄存器表达式寄存器文件名寄存器搜索模式寄存器命令行寄存器插入寄存器轮换缓冲区寄存器系统剪贴板选择和…

Python中的lambda表达式

lambda表达式被用于创建匿名函数。匿名函数就是没有名字的函数。 返回类型是函数类型。 作用:一行就可以表示一个函数,使代码简洁。很适合只使用一次的函数。 语法 lambda 参数:表达式等价于 def 函数名(参数):return 表达式举例 无参函数…

华为的型号命名规则_华为Mate 40 Pro+ 外观曝光 正面双挖孔 背部奥利奥

近日关于华为Mate 40 Pro的消息,又有了新进展。有媒体曝光出了一组Mate 40 Pro 的外观渲染图。华为Mate 40系列将会有三种型号,分别是华为Mate 40,Mate 40 Pro 和Mate 40 Pro ,这与之前发布的华为 P40 系列是相同的型号命名规则。…

drools 执行函数_Drools可执行模型还活着

drools 执行函数总览 可执行模型的目的是提供规则集的纯基于Java的表示,以及方便的Java DSL以编程方式创建这种模型。 该模型是低级的,旨在为用户提供所需的所有信息,例如用于索引评估的lambda。 这样可以使其保持快速运行,并避免…

vim 底行命令模式的正则表达式(匹配模式)

文章目录一、vim 替换表达式的语法格式二、vim 关于 range 的表达式三、vim 关于 flags 的元字符四、vim 关于数量的元字符五、环视和固化分组六、vim 替换表达式的示例(一)结合 copy 命令使用(二)结合 move 命令使用(…

navicat模型显示注释_RetinaNet模型构建面罩检测器

字幕组双语原文:如何使用RetinaNet模型构建面罩检测器英语原文:How to build a Face Mask Detector using RetinaNet Model!翻译:雷锋字幕组(李珺毅)介绍目标检测是计算机视觉中一个非常重要的领域,对于自动…

python中parse.add_argument()简单用法

argparse模块简单使用流程以及与命令行的交互1.导入模块2.创建解析器3.添加参数4.解析参数5使用参数完整代码与命令行的交互argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块。下面以例子来简单记下模块使用流程。1.导入模块 import argparse2.创建解析器 该…

java最好学习的方法_学习Java的最佳方法

java最好学习的方法Java是有些人可能说很难学习的语言之一,而其他人则认为它与其他语言具有相同的学习曲线。 两种观察都是正确的。 但是,由于Java具有平台无关性,因此在语言方面具有相当大的优势。 Java是一种低级语言,它以一种…