4

我目前正在尝试避免 GC_CONCURRENT 调用,所以我正在运行我的主循环。我注意到我经常创建一个复杂的对象来进行计算。

所以我的问题是将该对象声明为类的字段,而不是在使用它的方法中声明它有助于提高性能?

或者因为我的英语可能伤害了你的大脑,这里的代码示例作为字段

class myclass{
    private MyObject myObject;
    ...
    public void myLoopedMethod(...){
        myObject = new MyObject(...);
        myObject.dostuff;
    }

方法中的示例

class myclass{
    ...
    public void myLoopedMethod(...){
        MyObject myObject = new MyObject(...);
        myObject.dostuff;
    }

正确的范围是方法,但我怀疑通过使其成为一个字段,内存总是被释放并分配在同一个位置。这是真的吗?这是否有助于避免 GC 调用?

另外,我可能应该做这样的事情,但如果上述逻辑有意义,我很感兴趣。

class myclass{
    private MyObject myObject;
    ...
    public void myMethod(...){
        myObject.setNewValues(...);
        myObject.dostuff;
    }
}
4

2 回答 2

5

但我的疑问是,通过使其成为一个字段,内存总是被释放并分配在同一个位置。这是真的吗?这是否有助于避免 GC 调用?

不能保证内存分配在同一个位置。这是实现细节。

在您的示例情况下,如果是实例变量,则此实例变量引用的所有对象都将有资格进行 GC,除了仍然具有来自实例变量的引用的最后一个对象(当最后一个对象没有可访问的引用时,它将成为 GC 的资格)。

在定义内部方法的情况下,此引用所引用的所有对象将在循环完成后立即获得 GC 资格。

因此,除非您需要引用循环中标识的对象,否则最好使用定义内部方法。

关于避免 GC 调用的问题,我认为这两种方法的 GC 活动量几乎相同。除非您对内存有真正的问题,否则我建议不要担心内存分配和 GC,VM 足够智能,可以处理这些问题。

于 2012-12-21T15:00:57.823 回答
0
  1. 是的,如果对象的创建是在经常调用的方法中,它会给垃圾收集器带来更多的工作。

  2. 总是衡量而不是推测......理论上的优势可能微不足道。

于 2012-12-21T15:00:51.883 回答