java - JNA 内存清理
问题描述
根据JNA for Memory 类的文档,当需要释放不再引用的内存时,需要调用 finalize() 方法。但是在JNA 示例中,提到了 Memory 对象在超出范围时被释放。
// note: like Memory, StringArray will free the contiguous block of memory it copied the Strings into when the instance goes out of scope
问题是:
这是否意味着,当内存类对象超出范围并释放底层本机内存时,它会在内部调用 finalize()?
StringArray类和Memory类在内存管理方面的行为相同吗?如何?
解决方案
为了根据所提出的具体问题详细说明Matthias Bläsing 的回答,我想补充几点:
- 你一般不会直接调用
finalize()
. 它被 JVM 作为垃圾收集过程的一部分调用。 - 在方法
Memory
中finalize()
简单地调用dispose()
方法。如果您真的想立即摆脱内存,这将是首选的调用方法。但是,dispose()
如果您真的觉得需要清理本机内存分配,则protected
需要扩展以利用此方法。Memory
- 您可能会考虑的一个这样的子类是 extends
Closeable
,其中方法实现从超类close()
调用。dispose()
然后你可以,例如,使用资源块的尝试,并在块的末尾清理本机内存(资源)。当然,在 GC 之前,Java 对象仍然存在。 - 但是请注意,释放本机内存会带来处理成本,除非您的内存真的很短缺,否则它不会获得太多收益,因为您仍然拥有与对象关联的 Java 堆内存,直到它被 GC'd。如果您的内存太少并且要进入该级别的详细信息来控制本机分配清理的时间,您可能希望直接转到
malloc()
并free()
调用自己并在更高级别控制它,也许是回收/重用它。 ..
- 您可能会考虑的一个这样的子类是 extends
您还询问了StringArray
,但更接近平行的Memory
是NativeString
作为数组成员的对象。事实上,它们的内部实现是一个StringMemory
扩展的对象,Memory
因此它的行为相同;也就是free()
本机内存通过dispose()
viafinalize()
点处NativeString
是JVM垃圾回收。
推荐阅读
- visual-studio-code - 如何在 Visual Studio Code 中跳转断点行?
- ios - 为 Firebase 6.5.0 安装 Geofirestore
- c - 为什么 printf 说明符“%s”一次打印多个变量?
- css - CSS - 淡入不透明动画 - 元素显示然后做动画
- php - 获取 laravel 根目录中文件的相对路径
- ms-access - 查询中的表达式被视为字符串
- nio - 使用 Vert.x 将 zip 文件流式传输到调用应用程序
- apache - X-Forwarded-For not working in apache web server
- c# - 如何将文本描述添加到 KeyValuePair 列表?
- jmeter - ${__P(thread,1) 在我的 JMX 文件中不起作用