Direct ByteBuffer学习
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学习相关推荐
- Direct 3D学习笔记(三)——光照与材质
Direct 3D学习笔记(三)--光照与材质 现实世界中物体的颜色是一个复杂的系统,物体在不同的光照下,可能呈现在我们面前的就是不同的颜色.根据物理中的光学知识,物体在各种环境光照下,根据物体自身特 ...
- ByteBuffer学习笔记
该类继承Buffer类,Buffer类的继承关系图如下: Buffer类继承关系图 ByteBuffer类 从上面的图可以看出,该类有三个子类,MappedByteBuffer.HeapByteBuf ...
- 单目深度估计 | Learning Depth from Monocular Videos using Direct Methods 学习笔记
文章目录 摘要 1. 论文主要贡献: 2. 从视频中学习预测深度 2.1 尺度模糊 2.2 建模姿态估计预测器 3. 可微分直接视觉测距法 3.1 直接视觉测距法(DVO) 3.2 可微分的实现 4 ...
- Direct 3D学习笔记三:矩阵
仍然是基于先前的程序. 首先来介绍三个基本的矩阵,这是direct 3d中必须设置的三个矩阵,即世界矩阵,视图矩阵,投影矩阵.而对应的三个变换就是世界变换(World Transform),摄 ...
- 内存heap_哪个内存更快?Heap或ByteBuffer或Direct?
内存heap Java正在成为新的C / C ++,它被广泛用于开发高性能系统. 对像我这样的数百万Java开发人员来说非常好! 在这个博客中,我将分享我可以用Java完成的不同类型的内存分配的实验, ...
- 哪个内存更快?Heap或ByteBuffer或Direct?
Java正在成为新的C / C ++,它被广泛用于开发高性能系统. 对像我这样的数百万Java开发人员来说非常好! 在这个博客中,我将分享我可以用Java完成的不同类型的内存分配实验以及您从中获得的好 ...
- java内存映射缓存,java – 用于数据库实现的内存映射的MappedByteBuffer或直接ByteBuffer?...
这看起来像一个长期的问题,因为所有的上下文.下面的小说里有两个问题.感谢您抽出时间阅读并提供帮助. 情况 我正在开展可扩展的数据存储实现,可以支持在32位或64位系统上处理数据文件,从几KB到TB或更 ...
- 理解Java heap内存和Java direct内存
Java Heap内存 Java应用运行在Java运行环境(JVM),Java heap内存是JVM为java应用分配的内存.JVM被设计就是为了从机器上隔离应用.通常讨论Java内存,就是指Java ...
- ext ext.ajax_在Ajax应用程序中使用Ext.Direct
ext ext.ajax Ajax的概念使Web应用程序可以从缓慢,无响应和违反直觉的方式发展为类似于桌面应用程序的行为,提供即时反馈,消除页面刷新的需求并促进更好的用户体验. Ajax的问题在于 ...
最新文章
- 练习:每一分钟产生一个文件,保存本分钟内所有数字之和。
- 7z解压crc错误_winrar压缩包提示crc校验和错误,文件被破坏的解决办法
- css知识笔记(二)——盒子模型
- Leetcode--494. 目标和
- Filebeat 采集多个文件到es
- 软考5个高级中哪个好考_请问:计算机软考中、高级,哪个好考些呢?
- 计算机组成原理数据通路实验报告,数据通路组成实验汇总_相关文章专题_写写帮文库...
- 合并报表编制采用的理论_合并报表的基本逻辑是什么?
- 厦大C语言上机1382
- python中 math.isfinite返回值为false_Python math.isfinite() 方法
- origin画对数坐标_如何用Origin绘制对数坐标图、双横坐标图及插入到Word文稿
- Inventor 二次开发学习指南(入门到精通)
- zabbix监控配置(Grafana)
- taro 请务必在小程序页面中完善页面基础信息_小程序自定义导航栏(完美适配所有手机)...
- 【​观察】美国公有云“排位赛”结束 中国市场正“步其后尘”?
- 医院实验室lis系统开发带源码
- semi-continuous(半连续性)
- 分析 | 半导体元器件失效的五大原因详解
- Ubuntu18 USB网卡驱动安装踩坑记录
- 使用RocketQA实现检索式问答系统
热门文章
- 因为银行原因出现房贷逾期,怎么修复征信?
- 底部检测的do...while循环
- 万能驱动xp离线版_教你用SC封装软件来封装XP系统
- js修改地址栏url_不同寻常的地址栏过渡
- mysql编写函数 求1 n 偶数之和,编写求1 2 3 - n的函数.在main函数中调用该函数
- qregexp限制数字范围_数字系统实现电压电流控制的必经之路数模转换器
- eureka多了一个莫名其妙的服务_SpringCloud 服务注册与发现组件 Eureka
- 【theano-windows】学习笔记十四——堆叠去噪自编码器
- [论文笔记]CVPR2017_Joint Detection and Identification Feature Learning for Person Search
- How to ignore files and directories in subversion?