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

释放Java中本机库分配的内存

令狐宣
2023-03-14
问题内容

如果您运行的代码调用Java中的本机库,那么当内存分配应在对象的生存期内持续时,释放这些库分配的内存的常用方法是什么?在C
++中,我将使用析构函数,但是Java从来没有真正使用过析构函数,现在更少了。

我最感兴趣的特定情况是JOCL,其中有一个对象,该对象包装了已编译的OpenCL内核及其所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法clReleaseMemObject,您可以调用该方法来递减指示何时应删除对象的引用计数器(请注意,这与直接释放内存有些不同,但在这种情况下,我基本上不这么认为。

我假设如果程序终止时对象仍然存在,则操作系统会清除所有内容,但是我不确定线程​​中创建的对象。所以:

  1. 如果要在垃圾回收对象时释放本机内存,是否有合适的位置调用释放该内存的方法?

  2. 如果对象是将在线程持续时间内持续的对象,那么是否存在进行此调用的适当位置,或者甚至有必要这样做吗?


问题答案:

您可以使用清洁剂。这是Java
9中更正式的API,但在Java 1.4+中可用。

本质上,您给它提供了一个Runnable,以便在清理资源时执行。

使用Cleaner的优点之一是可以确定性地对其进行清理,但是如果忘记或不这样做,GC将在运行后对其进行调用。

当线程死亡时,没有一种安全的方法来清理对象,因为Thread对象即使死了也可以在程序的生命期内生存。一种更简单的方法是根据您的了解进行清理,或者在GC确定不需要之后进行清理。

另一种方法是使用参考队列和后台线程。它不那么优雅,但可以在Java 8和更高版本中使用。



 类似资料:
  • JDK版本是热点8U_45 我研究了java进程的本地内存。本机内存甚至比堆占用更多的空间。然而,有许多本机内存块,这使我感到困惑。pmap-x的结果,例如: 有许多占地约64m的街区。 那么如何跟踪这些内存块的来源呢?

  • wcsdup等函数隐式调用malloc为目标缓冲区分配内存。我想知道,由于内存分配不是很明确,所以显式释放存储似乎合乎逻辑吗?这更像是一种设计困境,赞成和反对的理由如下 应释放,因为 不释放它会导致内存泄漏。 wcsdup/_wcsdup调用malloc来分配内存,即使是从C程序调用的。 不应该被释放,因为 wcsdup积累的内存最终会在程序退出时被释放。在整个程序生命周期中,我们总是会遇到一些内

  • 问题内容: 有没有一种类似于函数的释放Java内存的方法?还是将对象设置为null并依靠GC是唯一的选择? 问题答案: Java使用托管内存,因此分配内存的唯一方法是使用运算符,而释放内存的唯一方法是依靠垃圾回收器。 该内存管理白皮书(PDF)可能有助于解释发生了什么。 你还可以致电建议垃圾收集器立即运行。但是,Java Runtime做出最终决定,而不是你的代码。 根据Java文档, 调用gc方

  • 本文向大家介绍Shell实现强制释放内存脚本分享,包括了Shell实现强制释放内存脚本分享的使用技巧和注意事项,需要的朋友参考一下 公司服务器最近两天老是因为内存被使用满而造成死机,实在是受不了老叫机房的人去帮忙重启,专门写了个脚本来释放下内存,当然这台服务器不是太重要,我粗鲁的处理方式估计不会适合大多数服务器,请大家使用之前先考虑清楚,不然造成数据丢失就不关我的事了. 脚本内容: cat che

  • 问题内容: JDK提供了分配所谓的直接ByteBuffer的能力,其中内存是在Java堆之外分配的。这可能是有益的,因为该内存不会被垃圾收集器占用,因此不会增加GC开销:这对于诸如缓存之类的长期存在的属性非常有用。 但是,现有实现存在一个关键问题:仅当拥有的ByteBuffer被垃圾回收时,底层内存才被异步分配;没有办法强制提前解除分配。这可能是有问题的,因为GC周期本身不受ByteBuffer的

  • 本文向大家介绍实现释放CentOS系统内存的Shell脚本分享,包括了实现释放CentOS系统内存的Shell脚本分享的使用技巧和注意事项,需要的朋友参考一下 这几天发现CentOS系统内存一直涨,即使把apache和mysql关闭了,内存也不释放,可以使用以下脚本来释放内存:   脚本内容:   利用系统crontab实现每天自动运行: 输入以下内容: 每天0点释放一次内存,这个时间可以根据自己