2023-01-19 360
我以为这个问题以前曾被问到,但我在这里找不到它…
我已经使用SWIG在C ++类周围创建JNI包装器.一切都很好,除了Java似乎从来没有称呼该类的最终确定(),因此,我班级的驱动器从未被打来.该类的destructor执行了一些最终文件I/O,因此不幸的是,这不仅仅是次要内存泄漏.
通过Google进行搜索,似乎没有一种方法可以强迫Java进入GC并销毁对象.是吗?
我知道我可以操纵我的swig文件并创建一个称为C ++驱动器的Java函数,但是最终用户使用几种不同的平台/语言使用此类,因此添加仅Java,将创建不一致之处我们的技术作家不会喜欢.
您不能用system.gc()强制GC.
另外,不能保证会有GC运行,例如,如果您的应用程序仅在短时间内运行,那么您的最终器就根本不会运行(JVM在退出时不会运行它).您应该创建一个Close()或Destract()或类的任何功能,并且使用此类实例完成后,最好是从最终块中,例如.
MyClass x = null;
try{
x = new MyClass();
x.work();
} finally {
if (x!=null)
x.close();
}
在我看来,
Java最终化器大多是没有用的,当然不是C ++破坏者的替代者.不幸的是,Java无法替代C ++ RAII.
不要费心尝试强制Java最终化.当您经历任何内容时,所有将处理它的函数.这就是您所能做的.
如果您依靠finalize方法中的代码在一定时间运行,则需要重新考虑您的方法.这里的问题在于,您不知道何时会由JVM调用finalize,因为您不知道该对象何时会收集垃圾.
您应该考虑的一件事,因为您的班级将在其他项目中重复使用,是最终用户可以使用类实例,以使其无法收集或垃圾收集不太可能,例如创建对类实例的静态引用.我认为创建close或destroy方法是您最安全的选择,以确保适当地发布与Java对象关联的C ++类的实例.
由于重复使用是一个问题,因此您可以检查C ++驱动器检查是否已发布资源,并在相同的代码中调用相同的代码,例如:
:
class MyThing {
public:
void close();
~MyThing();
private:
bool released = false;
};
void
MyThing::close() {
// close logic here
this->released = true;
}
MyThing::~MyThing() {
if (!released) {
this->close();
}
}
以这种方式,您现有的C ++代码希望不必更改太大,您可以确保在通过JNI运行的本机代码的上下文中以确定性的方式发布资源.
以上所述是小编给大家介绍的强迫Java称我的C ++破坏者(JNI),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25823.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态