最近用一个开源的控件,碰到ByteBuffer.allocateDirect()的时候OutOfMemoryError的问题,偶尔调用没问题,如果频繁的调用这个控件就会发生OutOfMemoryError,造成OutOfMemoryError的原因很简单ByteBuffer.allocateDirect()申请的内存没有释放,再申请的时候就不停的堆积,直到OutOfMemoryError,在网上找了很久都没有找到怎么释放ByteBuffer.allocateDirect()申请的内存,不过查到ByteBuffer.allocateDirect()申请的内存会由java的垃圾回收机制自动释放,可java的垃圾回收啥时候会释放根本不知道,没办法,剑走偏锋

while(true) {try {mByteBuffer = ByteBuffer.allocateDirect(newSize);break;} catch (OutOfMemoryError oome) {System.gc();}
}

这样,当内存被释放后就能创建成功了,因为不知道什么时候会释放内存,所以也不知道这个循环会执行多少次,这就会有个等待时间了,System.gc()纯粹是个心理安慰

最后这个循环只能写在子线程里

android ByteBuffer.allocateDirect()造成OutOfMemoryError相关推荐

  1. ByteBuffer.allocateDirect 与 allocate 方法

    一.首先是JavaDocument: 直接与非直接缓冲区 字节缓冲区要么是直接的,要么是非直接的.如果为直接字节缓冲区,则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作.也就是说 ...

  2. ByteBuffer.allocateDirect函数分析

    在NIO中,有两种分配字节的方法: 在堆中初始缓冲区 public static ByteBuffer allocate(int capacity) {if (capacity < 0)thro ...

  3. ByteBuffer.allocate()/ByteBuffer.allocateDirect()/JNI DETECTED ERROR IN APPLICATION: jarray was NULL

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  4. android byteBuffer的使用

    今天,讲讲android内byteBuffer的使用. 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲 ...

  5. java allocatedirect_java – ByteBuffer.allocateDirect()和MappedByteBuffer.load()之间的区别

    我试图通过使用MappedByteBuffer对特定文件进行内存映射来实现两个或多个JVM之间的一种共享缓存.从规范我看到当我们使用MappedByteBuffer.load()它应该将数据加载到直接 ...

  6. java byte 释放内存_java java.nio.ByteBuffer.allocateDirect 导致内存泄露

    java能够经过java.nio.ByteBuffer.allocateDirect(capacity)直接运用non java heap(java堆外)的内存 . 一.运用意图: 1.拓荒数据缓冲区 ...

  7. ByteBuffer.allocateDirect()

    ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别. https://blog.csdn.net/seebetpro/article/deta ...

  8. ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  9. ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别。

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

最新文章

  1. ImportError: Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.
  2. 如何把Linux工具里的“军刀”BusyBox移植到RT-Thread Smart?
  3. c语言popen函数多线程,关于多线程:多线程环境中的Python-Subprocess-Popen行为不一致...
  4. 最小生成树原理及Kruskal算法的js实现
  5. iphone4 Safari实现滚动条功能
  6. javascript array map方法
  7. 2、Kmeans算法处理出租车数据
  8. Java Web第三弹---Tomcat
  9. t3软件怎么生成报表_用友t3财务报表生成的步骤和流程
  10. 项目实训- 基于unity的2D多人乱斗闯关游戏设计与开发(综述)
  11. 如何查看浏览器cookie?附2个方法
  12. excel透视表——制作动态饼图
  13. 游戏音效中竟然有3D音效,这是什么鬼?
  14. Android studio 中使用GeenDao
  15. 建造者模式(Builder)---创建型
  16. c语言常用的运行速度优化,C语言程序设计优化(提速)
  17. 信奥中的数学 相关资料汇总(2022.07.08)
  18. python爬取京东手机参数_python爬虫——分页爬取京东商城商品信息(手机为例)...
  19. CSDN-markdown编辑器啊啊飒飒大
  20. PostMan9.11.0安装以及汉化教程

热门文章

  1. SSH整合出现Unable to locate persister
  2. HTML DOCTYPE
  3. 【错误小记】Mysql8.0遇到的坑坑坑坑洼洼哇哇哭也没用 盘你圆润
  4. 宝塔 开启xdebug_Xdebug 使用说明
  5. 怎样在家远程访问单位的电脑呢 有三个点子
  6. 牛客练习赛20 托米历险记
  7. PAT-python-1096 大美数
  8. 关于如何通过kali linux 攻击以及破解WPA/WPA2无线加密
  9. 环鸽的数列(数列的通项,区间加等比数列,区间求和)
  10. el-button入门学习