java - GC 优化 : declaring object as field opposed to declaring it locally

标签 java android

我目前正试图避免 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;
    }
}

最佳答案

but my doubt is that by making it a field, the memory is always freed and allocated in the same spot. Is this true and does this help avoiding GC calls?

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

在您的示例中,如果是实例变量,则此实例变量引用的所有对象都将符合 GC 条件,但仍然具有来自实例变量的引用的最后一个对象除外(最后一个对象在没有可达引用时将符合 GC 条件).

在定义内部方法的情况下,该引用引用的所有对象将在循环完成后立即符合 GC 条件。

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

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

关于java - GC 优化 : declaring object as field opposed to declaring it locally,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13992286/

相关文章:

android - 推断无效永远运行

java - 骡子 3 : How to get the values of "global-property" elements from Java source code

java - JNI : EnsureLocalCapacity ignored

Android 主题首选项对话框

android - Android Firebase 消息传递 SDK 如何防止 Intent 欺骗?

android - RecyclerView OnBindViewHolder 意外

Java 如何将音频数据存储在字节数组中。

java - 为什么人们在事件队列上运行 Java GUI

java - 如何正确终止/清除/停止/取消从另一个线程启动的线程?

android - 比较android中的两个字符串日期和时间?