ByteBuffer有两种一种是heap ByteBuffer,该类对象分配在JVM的堆内存里面,直接由Java虚拟机负责垃圾回收,一种是direct ByteBuffer是通过jni在虚拟机外内存中分配的。通过jmap无法查看该快内存的使用情况。只能通过top来看它的内存使用情况。

JVM堆内存大小可以通过-Xmx来设置,同样的direct ByteBuffer可以通过-XX:MaxDirectMemorySize来设置,此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后,即触发Full GC。注意该值是有上限的,默认是64M,最大为sun.misc.VM.maxDirectMemory(),在程序中中可以获得-XX:MaxDirectMemorySize的设置的值。

    @Testpublic void testBits() throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
//        System.out.println("maxMemoryValue:"+sun.misc.VM.maxDirectMemory()); ByteBuffer buffer=ByteBuffer.allocateDirect(0);Class c = Class.forName("java.nio.Bits");  Field maxMemory = c.getDeclaredField("maxMemory");  maxMemory.setAccessible(true);  synchronized (c) {  Long maxMemoryValue = (Long)maxMemory.get(null);  System.out.println("maxMemoryValue:"+maxMemoryValue);  }  }

下面要谈到垃圾回收机制:direct ByteBuffer通过full gc来回收内存的,direct ByteBuffer会自己检测情况而调用system.gc(),但是如果参数中使用了DisableExplicitGC那么就无法回收该快内存了,-XX:+DisableExplicitGC标志自动将System.gc()调用转换成一个空操作,就是应用中调用System.gc()会变成一个空操作。那么如果设置了就需要我们手动来回收内存了

    @Testpublic void testAllocateDirector() throws Exception{ByteBuffer buffer=ByteBuffer.allocateDirect(1024);Field cleanerField = buffer.getClass().getDeclaredField("cleaner");cleanerField.setAccessible(true);Cleaner cleaner = (Cleaner) cleanerField.get(buffer);cleaner.clean();}

那么除了FULL GC还有别的能回收direct ByteBuffer吗?CMS GC会回收Direct ByteBuffer的内存,CMS主要是针对old space空间的垃圾回收。但是是Oracle JDK 6u32以后的版本

讲了这么多谈下使用场景

1:多用网络编程中用到,实现zero copy,数据不需要再native memory和jvm memory中来回copy

2:由于造和析构Direct Buffer时间成本高,建议使用缓冲池,参见netty的实现

转载于:https://www.cnblogs.com/gaoxing/p/4302088.html

Direct ByteBuffer学习相关推荐

  1. Direct 3D学习笔记(三)——光照与材质

    Direct 3D学习笔记(三)--光照与材质 现实世界中物体的颜色是一个复杂的系统,物体在不同的光照下,可能呈现在我们面前的就是不同的颜色.根据物理中的光学知识,物体在各种环境光照下,根据物体自身特 ...

  2. ByteBuffer学习笔记

    该类继承Buffer类,Buffer类的继承关系图如下: Buffer类继承关系图 ByteBuffer类 从上面的图可以看出,该类有三个子类,MappedByteBuffer.HeapByteBuf ...

  3. 单目深度估计 | Learning Depth from Monocular Videos using Direct Methods 学习笔记

    文章目录 摘要 1. 论文主要贡献: 2. 从视频中学习预测深度 2.1 尺度模糊 2.2 建模姿态估计预测器 3. 可微分直接视觉测距法 3.1 直接视觉测距法(DVO) 3.2 可微分的实现 4 ...

  4. Direct 3D学习笔记三:矩阵

    仍然是基于先前的程序.     首先来介绍三个基本的矩阵,这是direct 3d中必须设置的三个矩阵,即世界矩阵,视图矩阵,投影矩阵.而对应的三个变换就是世界变换(World Transform),摄 ...

  5. 内存heap_哪个内存更快?Heap或ByteBuffer或Direct?

    内存heap Java正在成为新的C / C ++,它被广泛用于开发高性能系统. 对像我这样的数百万Java开发人员来说非常好! 在这个博客中,我将分享我可以用Java完成的不同类型的内存分配的实验, ...

  6. 哪个内存更快?Heap或ByteBuffer或Direct?

    Java正在成为新的C / C ++,它被广泛用于开发高性能系统. 对像我这样的数百万Java开发人员来说非常好! 在这个博客中,我将分享我可以用Java完成的不同类型的内存分配实验以及您从中获得的好 ...

  7. java内存映射缓存,java – 用于数据库实现的内存映射的MappedByteBuffer或直接ByteBuffer?...

    这看起来像一个长期的问题,因为所有的上下文.下面的小说里有两个问题.感谢您抽出时间阅读并提供帮助. 情况 我正在开展可扩展的数据存储实现,可以支持在32位或64位系统上处理数据文件,从几KB到TB或更 ...

  8. 理解Java heap内存和Java direct内存

    Java Heap内存 Java应用运行在Java运行环境(JVM),Java heap内存是JVM为java应用分配的内存.JVM被设计就是为了从机器上隔离应用.通常讨论Java内存,就是指Java ...

  9. ext ext.ajax_在Ajax应用程序中使用Ext.Direct

    ext ext.ajax Ajax的概念使Web应用程序可以从缓慢,无响应和违反直觉的方式发展为类似于桌面应用程序的行为,提供即时反馈,消除页面刷新的需求并促进更好的用户体验. Ajax的问题​​在于 ...

最新文章

  1. 练习:每一分钟产生一个文件,保存本分钟内所有数字之和。
  2. 7z解压crc错误_winrar压缩包提示crc校验和错误,文件被破坏的解决办法
  3. css知识笔记(二)——盒子模型
  4. Leetcode--494. 目标和
  5. Filebeat 采集多个文件到es
  6. 软考5个高级中哪个好考_请问:计算机软考中、高级,哪个好考些呢?
  7. 计算机组成原理数据通路实验报告,数据通路组成实验汇总_相关文章专题_写写帮文库...
  8. 合并报表编制采用的理论_合并报表的基本逻辑是什么?
  9. 厦大C语言上机1382
  10. python中 math.isfinite返回值为false_Python math.isfinite() 方法
  11. origin画对数坐标_如何用Origin绘制对数坐标图、双横坐标图及插入到Word文稿
  12. Inventor 二次开发学习指南(入门到精通)
  13. zabbix监控配置(Grafana)
  14. taro 请务必在小程序页面中完善页面基础信息_小程序自定义导航栏(完美适配所有手机)...
  15. 【​观察】美国公有云“排位赛”结束 中国市场正“步其后尘”?
  16. 医院实验室lis系统开发带源码
  17. semi-continuous(半连续性)
  18. 分析 | 半导体元器件失效的五大原因详解
  19. Ubuntu18 USB网卡驱动安装踩坑记录
  20. 使用RocketQA实现检索式问答系统

热门文章

  1. 因为银行原因出现房贷逾期,怎么修复征信?
  2. 底部检测的do...while循环
  3. 万能驱动xp离线版_教你用SC封装软件来封装XP系统
  4. js修改地址栏url_不同寻常的地址栏过渡
  5. mysql编写函数 求1 n 偶数之和,编写求1 2 3 - n的函数.在main函数中调用该函数
  6. qregexp限制数字范围_数字系统实现电压电流控制的必经之路数模转换器
  7. eureka多了一个莫名其妙的服务_SpringCloud 服务注册与发现组件 Eureka
  8. 【theano-windows】学习笔记十四——堆叠去噪自编码器
  9. [论文笔记]CVPR2017_Joint Detection and Identification Feature Learning for Person Search
  10. How to ignore files and directories in subversion?