当前位置: 首页 > 面试题库 >

如何在Java中垃圾收集直接缓冲区

孔安阳
2023-03-14
问题内容

我有一个内存泄漏,我已经将其隔离到错误配置的直接字节缓冲区。

ByteBuffer buff = ByteBuffer.allocateDirect(7777777);

GC收集包含这些缓冲区但不处理缓冲区本身的对象。如果实例化包含缓冲区的瞬态对象足够多,则会得到以下令人鼓舞的消息:

java.lang.OutOfMemoryError:直接缓冲存储器

我一直在寻找这个问题,显然

buff.clear();

System.gc();

不工作。


问题答案:

我怀疑您的应用程序某处有对ByteBuffer实例的引用,这阻止了它被垃圾回收。

直接ByteBuffer的缓冲内存是在普通堆之外分​​配的(以便GC不会移动它!)。但是,ByteBuffer
API没有提供显式处理/取消分配缓冲区的方法。因此,我假设垃圾回收器将执行此操作……一旦它确定不再引用ByteBuffer对象。



 类似资料:
  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner

  • 问题内容: 我们有一个PHP Webapp,它调用Java二进制文件以生成PDF报告(使用JasperReports)。Java二进制文件将PDF输出到标准输出,然后退出。然后,PHP将PDF发送到浏览器。这个Java命令持续大约3到6秒,我认为当它持续6秒时是因为GC启动。我想禁用GC,因为无论如何该命令退出时都会返回所有内存。 我想知道如何针对Java 1.4.2和Java 1.6.0禁用它,

  • 问题内容: 我有一段代码可以在内存中加载很大的图像。所以打电话似乎是合理的事情 在加载图像之前。据我所知,它毫无问题。 昨天,我决定使用一个名为FindBugs的非常有用的软件来扫描您的代码并报告可能导致错误或通常不建议使用的策略的问题。问题是我提到的这段代码得到了报告。描述是这样的: …强迫垃圾收集;除了基准测试代码外,都非常可疑 并继续阐述: 代码显式调用垃圾回收。除了基准测试中的特定用途外,

  • 问题内容: 有人可以解释一下G1垃圾收集器的工作原理吗?我还无法在任何地方找到任何全面,易于理解的描述。 谢谢 问题答案: 收集器将堆分成固定大小的区域,并跟踪这些区域中的实时数据。它将一组指针(“记住的集”)保留在区域内和区域外。当认为有必要使用GC时,它将首先收集实时数据较少的区域(因此,“垃圾优先”)。通常,这意味着一步就可以收集整个区域:如果进入一个区域的指针数量为零,则无需对该区域进行标

  • 有人能给我解释一下原因吗?