如何破坏java对象?

man*_*nix 7 java memory garbage-collection memory-management

好吧,我开发了一个使用多个对象关系的java应用程序,这使得内存使用过于昂贵.我没有管理java内存的经验,因为应用程序设计很难破坏对象并重新利用先前清除的空间.例如,我正在使用Observer和MVC模式.

所以,理论说......

如果从任何活动线程或任何静态引用无法访问对象,则该对象符合垃圾收集或GC的条件

换句话说,如果对象的所有引用都为null,则可以说对象符合垃圾回收的条件.

但是,在我的短暂经历中,当我有一个像我一样的场景,你不知道如何销毁我想要从内存中删除的对象(例如,当一个框架关闭时)时,我很难破坏所有引用存在许多对类的引用.

根据这个上下文,当有多个引用时,如何处理对象破坏?或者当你有一个复杂的参考对象时,我怎么需要管理内存?

hay*_*lem 17

注意动向

根据这个上下文,当有多个引用它时,如何处理对象破坏?

确保不再需要这些参考.

如果你将它们隔离开来,即使在一个大的孤立的图表中,未使用的对象也不再连接到你的主程序,那么它们都有资格进行垃圾收集.

已达到其范围末尾的局部变量将有资格进行垃圾收集(以及它们所包含的)对象,如果它们尚未"链接"到任何其他对象(添加到集合,ac omposite等等) .对于在对象图方面确实难以推理的UI对象,请确保正确处理它们或阅读文档以确保它们自然处理掉.

JVM中引用计数的简化视图

"让[GC]独自!!"

或者当你有一个复杂的参考对象时,我怎么需要管理内存?

你无法"管理"记忆.您可以简单地管理参考.我们的想法是通过简单地不引用它们来"严格"与对象的连接.然后它们会在内存中存活,直到GC消灭它们.

不要试图弄乱GC来强迫它做事.它是一个相当聪明的野兽,虽然你可以尝试指示它明确地对某些请求作出反应- 它可能会忽略你 - 这通常是一个坏主意:不要显式调用GC,如果你不理解则避免使用终结器和显式归零 它们的含义.


请注意回答您的评论

简单地将对已添加到多个集合或合成的对象引用置零将不会使其符合收集条件.通过这样做,你只能取消一个引用.

您需要从具有引用它的所有列表或容器中删除此对象(基本上,使它们"忘记"此对象).一旦没有任何对象仍然"记住"或者与您创建的对象具有"链接",它就会成为垃圾收集器图中的一个孤独项,这使它成为删除的候选对象.

也许这听起来很乏味,但是如果你从一种手动管理内存的语言中想到它(C或C++,命名最多2个明显的引用),那么释放和归零动态分配对象的指针确实会破坏它们,但你仍然需要从列表(或任何容器)中删除元素,或者它们看起来像空桶指向空指针.


进一步阅读


emo*_*ory 6

Java垃圾收集的重点是你不必做任何事情.垃圾收集为您完成.