2023-01-20 357
有了C ++和C#经验以及一些Java知识,我现在开始使用Java+JNI(C ++)项目(Android,如果很重要).
我有一种本机方法,可以创建一些C ++类,并将其作为Java长值返回指针(例如,句柄).然后在此处和那里从Java代码调用的其他本机方法,将句柄用作参数,在此类上进行一些本机操作. C ++一侧不拥有该对象,而是Java侧.但是在当前的架构设计中,很难定义谁确切拥有该对象以及何时删除该对象.因此,最好让Java VM垃圾收集器以某种方式管理对象的寿命. C ++类没有消耗任何资源,除了某些内存,而不是大.因此,可以,如果几个这样的对象不会破坏.
在C#中,我可能会在某些托管包装类中包装本机Intptr句柄.而且,当托管包装器收集垃圾时,将其称为本地对象的破坏者是最终的. Safehandle,AddMemoryPressure等也可能有帮助.
这是Java最终确定的另一个故事.您在Java的” Hello World”之后知道的第二件事是,使用最终确定是不好的.在Java中还有其他方法可以实现这一目标吗?也许使用幻影?
好吧,让我们考虑最终确定和CO有问题的原因:众所周知,您不能保证在关闭VM之前将调用最终确定,这意味着不一定运行特殊的清理代码(IMO)一个不好的决定,我认为清理时最终队列的问题没有任何问题,但这就是这样).这在C#
中完全相同
现在,您的对象仅消耗内存,当VM被销毁时,OS会清理内存,因此,最终确定问题的唯一情况对您来说无关紧要.因此,是的,您确实可以使用此变体,并且可以很好地工作,但是它可能并不完全被认为是一个很好的建筑设计 – 并且一旦您将资源添加到C ++代码中,该操作系统无法正确处理清理工作会遇到问题
还要注意,实施最终化器会为GC带来一些额外的开销,这意味着需要两个周期来清理这些对象之一(无论您做什么,都不要将对象保存在最终化方法中)
如果您理解为什么应避免使用Java的最终化方法,则还将了解如何正确使用它.使用最终确定进行关闭系统资源(文件和手柄)很不好,因为您实际上不知道何时关闭并发布这些资源.使用复杂最终确定逻辑不好,因为您的对象引用可能会泄漏并再次固定在内存中.
对于您的方案,最终使用完全很好.
使用最终制品的包装器是一个不错的解决方案
但是,如果您真的不想这样做,则可以使用带有参考标题的幻影将其清理(但是您将需要单独的线程来轮询队列)
以上所述是小编给大家介绍的有没有可能让GC管理本地对象的寿命?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25974.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日
扫码二维码
获取最新动态