缓冲池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
缓冲池java_了解Java缓冲池相关推荐
- 缓冲区溢出_了解Java缓冲池
缓冲区溢出 了解Java缓冲池 缓冲池空间位于垃圾收集器管理的内存之外. 这是分配本地堆外内存的一种方法. 使用缓冲池有什么好处? 为了回答这个问题,让我们首先了解什么是字节缓冲区. 字节缓冲区 非直 ...
- mysql的缓冲池大小_MySQL之缓冲池
1.缓冲池的定义 应用系统分层架构,为了加速数据访问,会把最常访问的数据放在缓存(cache)里,避免每次都去访问数据库.操作系统会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据 ...
- 搭建java_搭建java开发环境
① 第一步.下载jdk安装包. jdk官方下载网址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21 ...
- 深入java_深入Java Final
JAVA关键字final用于修饰数据.方法或类,通常意味着"无法改变的",既数据不能改变,方法不能覆盖,类不能继承.一般采用final有两种原因:设计和效率.而随着JAVA版本的更 ...
- 圆通招java_圆通java程序员面试经验|面试题 - 职朋职业圈
面试过程: 你所写的经历项目涉及到的东西,你在项目中的职责开发了哪部分:结构体对齐相关问题,怎样避免死锁,怎样在数据库添加成员 序列化 守护进程 JAVA的垃圾回收机制然后深入探讨了下这个 I+1其他 ...
- cloning java_深入浅出Java中的clone克隆方法,写得太棒了!
作者:张纪刚 blog.csdn.net/zhangjg_blog/article/details/18369201/ 2019-03-24 10:33:04 Java中对象的创建 clone 顾名思 ...
- 市面上不成熟的系统Java_回顾java基础知识
1.标识符和关键字 java语言规定标识符必须以字母.下划线(_).美元符号($)开关. 首字母必须是字母.下划线.或$,不能是数字,后面可接任意字符,不能包含@.#等其他特殊字符. 2.java关键 ...
- 遮掩java_关于java中的覆写、重载、隐藏、遮掩、遮蔽
最近在重新学习java,发现了以前未发现的几个概念,从网上搜索了一些资料,现在整理下.对于我来说,以前只是知道java中的覆写 重载和隐藏,这次却发现还有遮掩和遮蔽这两个概念.下面是整理的一篇文章. ...
- list字母排序 java_通过Java排序List集合的元素的几种方法
用Java工具类Collections的sort()方法,对List集合元素进行排序. Collections提供两种排序方法: 一.Collections.sort(List list); 此方法需 ...
最新文章
- 项目/程序的流程走向
- 解构 StyleCLIP:文本驱动、按需设计,媲美人类 P 图师
- 基于RNN的NLP机器翻译深度学习课程 | 附实战代码
- postman无法获得响应_【原创翻译】POSTMAN从入门到精通系列(二):发送第一个请求...
- 导入第三方库报 unknown type name 'NSString' 错误
- 0基础能学mysql数据库吗_mysql学习入门:零基础如何使用mysql创建数据库表?
- [转载] Java序列化的几种方式以及序列化的作用
- php 判断 in,tinkphp常用判断条件in、notin、between、AND、OR
- 我爱你们,我的家人和朋友
- 基于 AVPlayer 自定义播放器
- centos6使用docker部署zookeeper
- telnet无法访问
- 迅雷7.22 和迅雷5.9 去广告优化增强绿色版
- ImageNet千分类标签翻译
- 苹果12开发者设置_iPhone12手机5G在哪开启关闭 苹果12手机5G网络设置方法
- 移植python到小米路由器记录。
- PHP 输出各个时区对应的时差表
- SNMP介绍, OID及MIB库
- IBPS平台应用于南方电网总部运营管控平台
- swisssql-sql server to oracle,Sql Server移植到Oracle之Migration Workbench