如何销毁java对象?

如何销毁java对象?,java,memory,memory-management,garbage-collection,Java,Memory,Memory Management,Garbage Collection,我已经开发了一个java应用程序,它使用了几个对象关系,这使得内存使用过于昂贵。我没有管理java内存的经验,因为应用程序设计使得销毁对象和重新利用先前清除的空间变得困难。例如,我正在使用和MVC模式 所以,理论上说 如果对象不符合垃圾收集或GC条件,则该对象将符合条件 可从任何活动线程或任何静态引用访问 换句话说,如果对象的所有引用都为null,则可以说该对象有资格进行垃圾收集 但是,在我短暂的经验中,当您遇到像我这样的场景,您不知道存在多少对类的引用时,销毁我想要从内存中删除的对象(例如,当

我已经开发了一个java应用程序,它使用了几个对象关系,这使得内存使用过于昂贵。我没有管理java内存的经验,因为应用程序设计使得销毁对象和重新利用先前清除的空间变得困难。例如,我正在使用和MVC模式

所以,理论上说

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

换句话说,如果对象的所有引用都为null,则可以说该对象有资格进行垃圾收集

但是,在我短暂的经验中,当您遇到像我这样的场景,您不知道存在多少对类的引用时,销毁我想要从内存中删除的对象(例如,当一个帧关闭时)中的所有引用对我来说太难了


根据这个上下文,当存在多个对对象的引用时,如何处理对象销毁?或者,当您对彼此有复杂的引用时,我需要如何管理内存?

java垃圾收集的全部要点是您不必做任何事情。垃圾收集已经为您完成。

跟踪 根据这个上下文,当存在多个对对象的引用时,如何处理对象销毁

通过确保不再需要这些参考资料

如果您将它们隔离,即使是在一个大的未使用对象隔离图中,不再连接到主程序,那么它们都可以进行垃圾收集

如果本地变量未“链接”到任何其他对象(添加到集合、组件等),则已到达其作用域末尾的本地变量将有资格进行垃圾收集(其包含的对象也是如此)。对于UI对象,确实很难从对象图的角度进行推理,请确保正确地处理它们,或者阅读文档以确保它们自然地被处理掉

“别管[GC]” 或者,当您对彼此有复杂的引用时,我需要如何管理内存

你不能“管理”内存。您可以简单地管理引用。这样做的目的是通过不引用对象来“加强”与对象的连接。然后,它们在内存中生存,直到GC将它们消灭

不要试图干扰GC来强迫它做事情。它是一只相当聪明的野兽,虽然你可以尝试指示它对一些请求做出明确的反应它可能会忽略你-它是:,但要避免使用终结器和


请注意回答您的评论 对已添加到多个集合或组合中的对象的引用,如果仅将其置零,则不会使其符合集合条件。通过这样做

您确实需要从所有引用该对象的列表或容器中删除该对象(基本上,让它们“忘记”该对象)。一旦没有对象仍然“记住”或具有指向所创建对象的“链接”,它就会成为垃圾收集器图形中的一个孤立项,这使得它成为删除的候选项

听起来可能很乏味,但是如果你从一种语言中考虑到,你手动管理内存(C或C++,命名最明显的2个引用),释放和空出指针到你的动态分配的对象确实会破坏它们,但是你仍然需要从列表中移除元素(或者任何容器)。或者,对于空指针,它们看起来就像空桶


进一步阅读
  • (特别是关于
  • (日期已定,但非常好)
  • 这些问题涉及:
    • (提供大量附加信息和链接)

将您希望GC收集的每个引用分配给
null

您可以做的是创建一个中间类。例如,如果您有一个类A的实例,对于该实例,您有很多引用,并且您想要删除它,但是很多引用使得删除变得困难,那么您可以执行以下操作:创建一个类B的实例,该实例只包含对类A实例的引用(比如某种代理)。现在,您将有很多对类B实例的引用,但只有一个对类a实例的引用,您可以轻松地删除这些引用,垃圾收集器将收集类a实例

图显示了使用代理(类B的实例)时的区别:现在只需删除一个引用


在大多数情况下,GC会在适当的时候发挥它的魔力

您可能会遇到这样的情况,例如,视图正在观察模型,您希望放弃视图,但保留模型。在这种情况下,您需要记住observer回调对象,并在讨论视图时删除它们。您不必为每个观察者都有特殊的字段-一组任务可以取消注册每个回调。或者,更复杂的是,您可以在模型上有一层瞬态间接寻址,它可以从基础模型中解压。我建议避免使用带有某种弱引用的奇怪的东西


如果您可能有最终者(或需要某种弱映射逐出),例如可能使用java.awt.Frame,那么您可能需要在资源和内存占用之间设置一层间接层,可以简单地将其清空。

Nuff说lol。同样,在您的情况下,我明白您为什么担心。但是这样想,或者说有两种情况。1、创建您正在使用的任何代码的开发人员都不会记录潜在的内存泄漏,在这种情况下,除了使用其他东西之外,您不能做很多事情。2、您阅读了说明这一点的文档,并帮助您避免任何您所说的问题。因此,除非你怀疑某些代码正在减慢你的应用程序的速度,一般不要太担心它