我目前正在尝试避免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;
}
}
答案 0 :(得分:5)
但我怀疑的是,通过使它成为一个领域,记忆总是被释放 并分配在同一地点。这是真的,这有帮助 避免GC调用?
无法保证在同一位置分配内存。这是实施细节。
在您的示例中,如果是实例变量,此实例变量引用的所有对象都将符合GC条件,但最后一个对象仍然具有来自实例变量的引用(当没有可访问引用时,最后一个对象将符合GC条件)。
如果定义了inside方法,那么在完成循环后,此引用引用的所有对象都将符合GC的条件。
因此,除非需要引用循环中标识的对象,否则最好定义内部方法。
为了避免GC调用,我认为这两种方法的GC活动量几乎相同。除非你对内存有真正的问题,否则我建议不要担心内存分配和GC,虚拟机足够聪明,可以照顾这些东西。
答案 1 :(得分:0)
是的,如果对象创建在经常调用的方法中,则会为垃圾收集器带来更多的工作。
始终衡量而不是推测......理论上的优势可能微不足道。