【问题标题】:Changing reference of object and garbage collector更改对象和垃圾收集器的引用
【发布时间】:2014-07-31 02:12:09
【问题描述】:

所以在 Java 中,如果我有两个相同类型的对象,并且我将其中一个设置为另一个(两者具有相同的引用),是否会调用垃圾收集器?

ClassName obj1 = new ClassName();
ClassName obj2 = new ClassName();
obj1 = obj2;

这会调用垃圾收集器吗?我问的原因是因为我正在为 android 制作游戏,我不能在游戏运行时调用垃圾收集器,因为我想要最好的性能。我知道“new”关键字会调用垃圾回收,但我不知道这是否会。谢谢!

【问题讨论】:

  • 不,垃圾收集器只有在系统中的测量表明它应该被“调用”时才会被“调用”。您不必担心这是什么时候。

标签: java reference garbage-collection


【解决方案1】:

构造函数(“new”关键字)不调用垃圾收集器。 一旦你将obj2 分配给obj1,如果没有更多对obj1 引用的原始对象的引用,垃圾收集器可以收集它,但你不知道什么时候会发生。

【讨论】:

  • 嗯,我需要知道它什么时候会发生,这样我才能确保它不会在我的游戏中运行。
【解决方案2】:

简单地取消引用对象不会强制垃圾收集器运行。它只是意味着该对象在将来的某个时候有资格被收集。 有多种垃圾收集策略和实现。 Oracle 通过所有最近的 java 版本继续提供新的 GC 策略。我对 android 不太熟悉,但我认为它可能使用与 Oracle 不同的 GC 策略。

【讨论】:

    【解决方案3】:

    obj1 之前指向的对象将成为有资格进行垃圾回收。您无法控制何时调用垃圾收集器。

    【讨论】:

    • 可以触发垃圾回收:System.gc()
    • 这被认为是一种不好的做法,通常不鼓励这样做。 stackoverflow.com/questions/2414105/…
    • 在某些情况下(或几年前曾经)需要在 Android 中显式调用 gc() 来触发不驻留在常规堆中的图像对象的收集。但这是调用 gc() 有用的少数情况之一。
    • 对于游戏开发来说,性能就是一切,垃圾收集器会显着降低它。有什么方法可以将垃圾收集器“限制”在某个时间范围内,以确保它不会破坏游戏玩法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2012-07-09
    • 2017-06-20
    相关资源
    最近更新 更多