Ale*_*Che 5 java java-native-interface garbage-collection memory-management native
凭借C++和C#经验以及一些小知识,我现在正在开始一个Java + JNI(C++)项目(Android,如果这很重要).
我有一个本机方法,它创建一些C++类并返回一个指向它的指针作为Java long值(比如句柄).然后在其中使用Java代码调用其他本机方法,使用句柄作为参数在此类上执行一些本机操作.C++方面不拥有该对象,它是Java方面的人.但是在当前的架构设计中,很难定义谁拥有对象以及何时删除它.因此,使Java VM垃圾收集器以某种方式管理对象的生命周期可能会很好.C++类不消耗任何资源,除了一些内存,不是很大.如果几个这样的物体不会被破坏,那就没关系了.
在C#中,我可能会在一些托管包装类中包装本机IntPtr句柄.并且当托管包装器被垃圾收集时,覆盖它的终结器来调用本机对象的析构函数.SafeHandle,AddMemoryPressure等也可能对此有所帮助.
这是与Java最终确定的不同的故事.你在Java中的'Hello world'之后知道的第二件事是使用finalize是不好的.有没有其他方法可以在Java中实现这一目标?也许使用PhantomReference?
好吧,让我们考虑为什么最终确定和Co是有问题的:正如你所知,不能保证在VM关闭之前调用finalize,这意味着特殊的清理代码不一定会运行(我做的很糟糕,我不喜欢在清理时看到在finalize队列中运行的任何问题,但这就是它的原因.这也是C#中完全相同的情况
现在你的对象只消耗内存,当虚拟机被破坏时,无论如何都会被操作系统清理掉,因此唯一有问题的情况对你来说无关紧要.所以,是的,你确实可以使用这个变体,它可以完美地工作,但它可能不完全被认为是一个伟大的架构设计 - 并且只要你的C++代码添加资源,操作系统无法正确处理清理你会遇到问题
另请注意,实现终结器会导致GC的一些额外开销,并且意味着需要两个周期来清理其中一个对象(无论您做什么,都不要在finalize方法中保存对象)
| 归档时间: |
|
| 查看次数: |
1387 次 |
| 最近记录: |