ByteBuffer.allocateDirect()内存溢出怎么办?

十三邵 2015-07-31 09:13:00
ByteBuffer mByteBuffer = ByteBuffer.allocateDirect(82944000);

执行这一句的时候报
java.lang.OutOfMemoryError
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at java.nio.MemoryBlock.allocate(MemoryBlock.java:125)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:72)
at com.qd.recorder.RecorderThread.run(RecorderThread.java:48)
...全文
1133 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxfx888 2017-10-03
  • 打赏
  • 举报
回复
引用 1 楼 gao_chun 的回复:
你这内存空间分配分配的是不是太大了点啊。ByteBuffer提供了直接和非直接缓冲区 ,allocateDirect(),和allocate() allocate和allocateDirect方法都做了相同的工作,不同的是allocateDirect方法直接使用操作系统来分配Buffer。所以它提供更快的访问速度。但并非所有的虚拟机都支持这种直接分配的方法。 Sun推荐将以字节为单位的直接型缓冲区allocateDirect用于与大型文件相关并具有较长生命周期的缓冲区。 具体使用可以去了解下ByteBuffer类。去google一把再说吧
allocateDirect分配的内存在用户空间还是内核空间
huangweisaf 2015-11-09
  • 打赏
  • 举报
回复
同样遇到此问题 求解
颍川公子 2015-10-28
  • 打赏
  • 举报
回复
请问楼主,这个问题解决了吗?我也遇到了,不知道该怎么做,请分享下,谢谢
gao_chun 2015-07-31
  • 打赏
  • 举报
回复
你这内存空间分配分配的是不是太大了点啊。ByteBuffer提供了直接和非直接缓冲区 ,allocateDirect(),和allocate() allocate和allocateDirect方法都做了相同的工作,不同的是allocateDirect方法直接使用操作系统来分配Buffer。所以它提供更快的访问速度。但并非所有的虚拟机都支持这种直接分配的方法。 Sun推荐将以字节为单位的直接型缓冲区allocateDirect用于与大型文件相关并具有较长生命周期的缓冲区。 具体使用可以去了解下ByteBuffer类。去google一把再说吧
开发者_android 2015-07-31
  • 打赏
  • 举报
回复
使用本地缓存,不会自动回收资源。而且,你的大小也太大了吧。 使用堆缓冲区,也就是用这个方法:ByteBuffer.allocate()不能满足你需求吗?一般情况下这个是够用的,JVM还会回收。

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧