C库和java包装器类以及用于处理库中C类的本机函数(JNI).当常见的Java代码需要C对象时,它会创建相应的java包装器对象,该对象通过本机函数创建C对象,并在“long”变量中记住指向本机对象的指针.在所有下一个 *** 作中,包装器将此指针指向本机函数等.
问题:
如何在最后释放所有分配的C对象?目前,每个包装类都有’finalize’方法,它调用本机函数来释放C对象,但AndroID不保证调用’finalize’!另一方面,通常C库不知道java代码分配了多少和哪些类型的C对象.
当我们的Java应用程序终止时,剩下的已分配内存将会发生什么,当 *** 作系统卸载库时,AndroID会自动释放从本机库使用的整个堆吗?
解决方法 在进程生命周期结束时,系统将释放并回收所有进程内存(Java和C堆).但有一点是,AndroID活动结束并不一定会结束这个过程.我不确定那里的流程关闭政策是什么.另一方面,依赖于垃圾收集和finalize()听起来像是坚实的设计.你声称 – “AndroID不保证finalize()”.你有没有引用它?因为如果它附带免责声明“当对象作为进程关闭的一部分被释放时……”,那么我们仍然很好.
如果你是超级偏执狂,你可以编写自己的malloc()/ free()/ realloc()包装器,存储所有已分配对象的列表,并引入一个清理函数,遍历列表并释放它们.但是,包含Java对象可能以一种奇怪的僵尸状态结束,其中内存已从其下面释放.这是一个很容易出错的棘手主张.所以我仍然会说 – 对垃圾收集器有信心.缺乏这将是令人不安的.
总结以上是内存溢出为你收集整理的android – Native C库 – 谁必须释放内存以及如何?全部内容,希望文章能够帮你解决android – Native C库 – 谁必须释放内存以及如何?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)