Java短生命周期对象和垃圾收集

3

我正在评估频繁创建小型短生命周期对象(比如每秒钟一次)对垃圾收集和内存占用的影响,特别是在Android Java实现上。

进一步说明,我们有一个应用程序在线程中从网络接收频繁更新,并将其传递给应用程序中的小型结构体。在C中,我们创建类型为结构体的局部变量并进行传递:

void passToApp(int a, int b, int c) {

   AppStruct p;
   p.a = a;
   p.b = b;
   p.c = c;
   appFunction(&p);
}

在C语言中,这不是问题,因为p在堆栈中。然而,在Java中,每个对象都需要被分配和后来由GC释放。

void passToApp(int a, int b, int c) {

   AppStruct p = new AppStruct();
   p.a = a;
   p.b = b;
   p.c = c;
   appFunction(p);
}

请就此情况分享您的见解和任何最佳实践。

对其进行性能分析,看是否存在任何问题。当它每秒只发生一次时,影响将为0。 - undefined
如果你试图优化这样的东西,那你可能在使用错误的平台... 话虽如此,Java通常在分配方面非常快速,而且如果它们的生命周期很短,它们永远不会离开Eden空间,这也非常高效。最好的方法是测量它。 - undefined
1个回答

0
你可以像这样创建所有的对象
    private class AppStruct{
        boolean used;

        public void release() {
            used = false;
        }
    };
    private final static int MAX_COUNT = 100;
    private final AppStruct[] pool = new AppStruct[MAX_COUNT];
    public AppStruct obtain() {
        for (int i = 0; i < pool.length; ++i){
            if (!pool[i].used) {
                pool[i].used = true;
                return pool[i];
            }
        }
        // max count is set wrong
        return new AppStruct();
    }

这只是一个简单的例子,你可以考虑使用列表或其他东西。
主要思路是创建一个只会被创建一次的final对象,并且这样做对于垃圾回收来说是没问题的。最好不要创建太多对象,因为它可能会影响UI线程并降低FPS。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接