缓冲池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缓冲池相关推荐

  1. 缓冲区溢出_了解Java缓冲池

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

  2. mysql的缓冲池大小_MySQL之缓冲池

    1.缓冲池的定义 应用系统分层架构,为了加速数据访问,会把最常访问的数据放在缓存(cache)里,避免每次都去访问数据库.操作系统会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据 ...

  3. 搭建java_搭建java开发环境

    ① 第一步.下载jdk安装包. jdk官方下载网址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21 ...

  4. 深入java_深入Java Final

    JAVA关键字final用于修饰数据.方法或类,通常意味着"无法改变的",既数据不能改变,方法不能覆盖,类不能继承.一般采用final有两种原因:设计和效率.而随着JAVA版本的更 ...

  5. 圆通招java_圆通java程序员面试经验|面试题 - 职朋职业圈

    面试过程: 你所写的经历项目涉及到的东西,你在项目中的职责开发了哪部分:结构体对齐相关问题,怎样避免死锁,怎样在数据库添加成员 序列化 守护进程 JAVA的垃圾回收机制然后深入探讨了下这个 I+1其他 ...

  6. cloning java_深入浅出Java中的clone克隆方法,写得太棒了!

    作者:张纪刚 blog.csdn.net/zhangjg_blog/article/details/18369201/ 2019-03-24 10:33:04 Java中对象的创建 clone 顾名思 ...

  7. 市面上不成熟的系统Java_回顾java基础知识

    1.标识符和关键字 java语言规定标识符必须以字母.下划线(_).美元符号($)开关. 首字母必须是字母.下划线.或$,不能是数字,后面可接任意字符,不能包含@.#等其他特殊字符. 2.java关键 ...

  8. 遮掩java_关于java中的覆写、重载、隐藏、遮掩、遮蔽

    最近在重新学习java,发现了以前未发现的几个概念,从网上搜索了一些资料,现在整理下.对于我来说,以前只是知道java中的覆写 重载和隐藏,这次却发现还有遮掩和遮蔽这两个概念.下面是整理的一篇文章. ...

  9. list字母排序 java_通过Java排序List集合的元素的几种方法

    用Java工具类Collections的sort()方法,对List集合元素进行排序. Collections提供两种排序方法: 一.Collections.sort(List list); 此方法需 ...

最新文章

  1. 项目/程序的流程走向
  2. 解构 StyleCLIP:文本驱动、按需设计,媲美人类 P 图师
  3. 基于RNN的NLP机器翻译深度学习课程 | 附实战代码
  4. postman无法获得响应_【原创翻译】POSTMAN从入门到精通系列(二):发送第一个请求...
  5. 导入第三方库报 unknown type name 'NSString' 错误
  6. 0基础能学mysql数据库吗_mysql学习入门:零基础如何使用mysql创建数据库表?
  7. [转载] Java序列化的几种方式以及序列化的作用
  8. php 判断 in,tinkphp常用判断条件in、notin、between、AND、OR
  9. 我爱你们,我的家人和朋友
  10. 基于 AVPlayer 自定义播放器
  11. centos6使用docker部署zookeeper
  12. telnet无法访问
  13. 迅雷7.22 和迅雷5.9 去广告优化增强绿色版
  14. ImageNet千分类标签翻译
  15. 苹果12开发者设置_iPhone12手机5G在哪开启关闭 苹果12手机5G网络设置方法
  16. 移植python到小米路由器记录。
  17. PHP 输出各个时区对应的时差表
  18. SNMP介绍, OID及MIB库
  19. IBPS平台应用于南方电网总部运营管控平台
  20. swisssql-sql server to oracle,Sql Server移植到Oracle之Migration Workbench

热门文章

  1. Poj 1011 UVA - 307 Sticks
  2. 牛客网【每日一题】4月28日题目精讲 美味菜肴
  3. 【正睿2021寒假省选第二轮集训 day 1】令牌生成 (组合数+二分)
  4. P4306-[JSOI2010]连通数【bitset】
  5. jzoj4815-ksum【堆】
  6. 2019纪中暑假游记+总结
  7. codeforces1456 D. XOR-gun
  8. 【状压DP】滚榜(P7519)
  9. 北京区域赛I题,Uva7676,A Boring Problem,前缀和差分
  10. 如何在局域网访问Tomcat项目