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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

魔兽争霸Ⅲ运行时不能初始化directX的错误解决

运行魔兽争霸3不能初始化DirectX错误这样解决: 1:在运行中输入(winr):dxdiag,查看显示栏,确定电脑已安装好directx 8.1以上,且下面的三个加速都已开启。 2:如果没有安装directx就下载安装一个&a…

Android7.0占用空间,Android7.0 开发者注意事项

1、当设备处于充电状态且屏幕已关闭一定时间后,设备会进入低电耗模式并应用第一部分限制:关闭应用网络访问、推迟作业和同步。如果进入低电耗模式后设备处于静止状态达到一定时间,系统则会对 PowerManager.WakeLock、AlarmManager 闹铃、GPS …

Android探索之旅 | 面向对象和Java基础

-- 作者 谢恩铭 转载请注明出处 上一篇 Android探索之旅 | Android简介 中说到: "Android的默认开发语言是Java,入门简单。而且,你的Java水平不需要多好就可以上手开发Android App了。" 不少朋友说看到后很是心安。 不过小编也不想…

DataGirdView 编辑项时的验证

dgvConfig.DataSource CreateTable();dgvConfig.Columns["编号"].ReadOnly true; //只读dgvConfig.AllowUserToAddRows false; //不允许添加新行dgvConfig.EditingControlShowing new DataGridViewEditingControlShowingEventHandler(dgvConfig_EditingControlS…

使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)

前言 本章将实现非常实用的功能——下载在线视频。涉及到多线程、线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术细节实现&#xff01…

生成0到1之间随机数的C代码

#include <stdlib.h>#include <stdio.h>#include <time.h>int main(){srand((unsigned)time(NULL));int i;double r;for(i0;i<50;i){r(float)rand()/RAND_MAX; printf("%f\n",r);}return 0;}

HTML声明文档类型后样式出错,doctype如何声明

如何doctype声明&#xff0c;新增的结构元素和功能元素HTML5已形成了最终的标准&#xff0c;概括来讲&#xff0c;它主要是关于图像&#xff0c;位置&#xff0c;存储&#xff0c;多任务等功能的增加。 新增的元素有绘画 canvas &#xff0c;用于媒介回放的 video 和 audio 元素…

Error-Project facet Java version 1.8 is not supported

最近导入最新的Strtus2.5.10.1 Demo时出现了这个错误 解决方案如下&#xff1a; 选中工程——右键——Properties 然后依次展开找到如图所示内容&#xff0c;将1.8改成1.7即可。 原因&#xff1a;工程默认配置是1.8&#xff0c;而本地环境JDK版本为1.7&#xff0c;两则不匹配造…

6.2

转载于:https://www.cnblogs.com/tutuaixiaomei/p/3354356.html

Tomcat全攻略

内容&#xff1a; 一&#xff1a;简单介绍二&#xff1a;安装及配置三&#xff1a;应用四&#xff1a;综述參考资料关于作者宗 锋西北大学计算机系硕士2001 年 12 月 随着java的流行&#xff0c;其在web上的应用也越来越广&#xff0c;tomcat作为一个开源的servlet容器&#xf…

《G档案》中关于游戏程序设计的文章

刚拿到前导的《G档案》&#xff0c;发现了主程刘刚的文章&#xff0c;是目前我所见 到的关于游戏编程的最好的一篇&#xff0c;与大家共享。转载&#xff1a;http://www.360doc.cn/article/2778_53476.html PC游戏编程 目录 1 游戏程序理论 1.1 技术基础 1.2 游戏底层 1.3 编…

shell笔记

system 磁盘 磁盘空间使用情况df查看文件或目录大小du挂载usb sudo fdisk -l # Find what the drive is called e.g. /dev/sdb1 sudo mkdir /media/usb sudo mount /dev/sdb1 /media/usb sudo umount /media/usb# umount sudo umount /media/usb utils awk 打印文件的第一列(域…

html5编辑文档,HTML5带各种趣味动画的文本编辑器

CSS语言&#xff1a;CSSSCSS确定body {background-color: #eee;}html,body {margin: 0px;height: 100%;overflow: hidden;}.toolbar {width: 100%;background: #fff;padding: 4px 10px;}.characters {display: inline-block;margin-right: 20px;vertical-align: top;}.characte…

社会转型

转载&#xff0c;版权由作者所有。 常常在政府工作报告中看到关于“社会转型期”的说法&#xff0c;不是太明白&#xff0c;在百度里找了找&#xff0c;果然有不少&#xff0c;摘抄下来&#xff0c;做为学习资料用&#xff1a; 一是指体制转型&#xff0c;即从计划经济体制向市…

在WPF中处理Windows消息

在Winform中 处理Windows消息通过重写WndProc方法 在WPF中 使用的是System.Windows. Sytem.Windows.Controls等名字空间&#xff0c;没有WndProc函数 WPF中处理消息首先要获取窗口句柄&#xff0c;创建HwndSource对象 通过HwndSource对象添加消息处理回调函数。 此外 WPF中没有…

Android Material风格的应用(三)--DrawerLayout

添加抽屉导航 Android Material风格的应用(一)--AppBar TabLayoutAndroid Material风格的应用(二)--RecyclerViewAndroid Material风格的应用(三)--DrawerLayoutAndroid Material风格的应用(四)--FloatActionButtonAndroid Material风格的应用(五)--CollapsingToolbar DrawerLa…

html5 数据缓存,HTML5: 本地缓存

HTML5 提供了两种在客户端存储数据的新对象&#xff1a;localStorage&#xff1a;没有时间限制的数据存储&#xff0c;在同一个浏览器中&#xff0c;只要没被手动清理&#xff0c;第二天、第二周或下一年之后&#xff0c;数据依然可用。sessionStorage&#xff1a;针对一个 ses…

C# 委托:把方法组合到一个数组中使用

C# 委托&#xff1a;把方法组合到一个数组中使用 using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApplication1 {class MathOperations{public static double MultiplyByTwo(double value){return value * 2;}public…

上传Text文档并转换为PDF

今天在ASP.NET MVC环境中学习一些PDF相关的知识&#xff0c;想法是上传文件成功时&#xff0c;并把文件转换为PDF文档。 打开你的专案&#xff0c;运行NuGet包管理器&#xff0c;下载一个叫iTextSharp的东东&#xff1a;点击Install&#xff0c;按钮提示确认安装&#xff0c;成…

某著名公司2015暑期实习招聘试题及相关内容复习

1.&#xff09;输出下面的结果<pre name"code" class"cpp">#include <iostream> using namespace std;int main(int argc, char *argv[]) {int **a[5][4];int *b[5][4];int *c[5];int d[5][4];char *e"helloworld";char g[]"01…