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的设置的值。

    @Test
public 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()会变成一个空操作。那么如果设置了就需要我们手动来回收内存了

    @Test
public 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的实现

最新文章

  1. HDU 1240 Asteroids! 解题报告
  2. Android之Socket群组聊天
  3. 【Linux高频命令专题(17)】head
  4. 如何为 setTimeout() 方法传参
  5. logstash nginx 报ArgumentError: comparison of String with 5 failed
  6. jq 22 一个很好图片显示
  7. 使用WSE实现Web Service安全----我的第一篇
  8. hdu1032
  9. Opencv+MFC获取摄像头数据,显示在Picture控件
  10. Swift: 使用cocoapods进行单元测试找不到bridge_header文件
  11. JavaScript笔记之第四天
  12. Spring 源码剖析IOC容器(一)概览
  13. 1.UTF8字符集csv文件在oracle下乱码问题处理
  14. uva-507
  15. WindowsPE权威指南 第二章 小工具 pedump代码的C语言实现
  16. 使用 OpenSSL 创建私有 CA:3 用户证书
  17. MySQL 索引长度和区分度
  18. 1.RN环境搭建,创建项目,使用夜神模拟调试
  19. 8、sort排序中比较函数的几种应用方式
  20. 测试oracle数据库连接

热门文章

  1. mac外接键盘修饰键设置
  2. UGUI技巧
  3. Mxgraph使用总结一
  4. vlan之间Hybrid端口配置
  5. 机器学习:评价分类结果(ROC 曲线)
  6. HTML 和 CSS
  7. rails的respond to format
  8. .netcore 在linux 上运行 Helllo World 例子
  9. 将chrome浏览器的默认背景颜色修改为浅绿色,以减缓长时间看电脑的眼睛不舒服的问题
  10. java selenium webdriver第二讲 页面元素定位