首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >减少返回数组的方法的Java垃圾回收?

减少返回数组的方法的Java垃圾回收?
EN

Stack Overflow用户
提问于 2018-10-27 04:27:21
回答 1查看 238关注 0票数 1

对象A具有方法B(),并且在应用程序的大部分生命周期中都存在。B调用对象C方法D()。D()返回一个最多可以容纳x个MyData对象的数组。MyData可能是POD (普通老式数据)/PDS(被动数据结构),也可能更多,但是MyData可以通过调用方法或设置字段来重用;它的身份或功能在构造过程中或其他方面不会一成不变。

目前,B()的定义如下:

代码语言:javascript
复制
class A {
  public B() {
    MyData[] amydata = c.D( 5 );
       :
       :
  }
}

目前D()的定义如下:

代码语言:javascript
复制
MyData[] D( int iRows ) {

    MyData[] amydata = new MyData[ iRows ];

    for ( int i = 0; i < iRows; i++ ) {

        if ( no more data )
            return amydata;

        amydata [ i ] = new MyData();

        // calculate or fill in MyData structure.
    }

    return amydata;
}

A将总是或在很长一段时间内(例如,直到用户重新配置它)请求相同数量的行,即使数据将不同。

所以如果我让调用者在数组引用中传递:

代码语言:javascript
复制
class A {
  int iRequestSize = 5;
  int iResultSize;
  MyData[] amydata = new MyData[ iRequestSize ];

  public B() {
    iResultSize = c.D( iRequestSize, amydata );
       :
       :
    // use up to iResultSize even though array is potentially bigger.
  }
}

// returns number of rows actually used
int D( int iRowsMax, MyData[] amydata ) {

    for ( int i = 0; i < iRowsMax; i++ ) {

        if ( no more data )
            return i;

        if ( amydata [ i ] == null )
            amydata [ i ] = new MyData();

        // calculate or fill in MyData structure.
    }

    return iRowsMax;
}

我是一个C++爱好者,也是Java的新手,但似乎假设MyData可以像这样被回收,那么第二个版本应该避免创建和复制MyData,以及消除垃圾收集?

EN

回答 1

Stack Overflow用户

发布于 2018-10-27 05:15:54

我会说第二个变种更糟糕。

在第一个变体中,一旦方法B()退出,amydata及其引用的所有对象就可以被垃圾收集(假设B没有在其他地方存储对amydata的引用)。

在第二个变体中,只要amydata的实例还存在,就不能对A进行垃圾回收。

考虑这样一种情况,在第一次调用D()时,它返回5个对MyData对象的引用,但在随后的调用中,它不再返回任何行。在第一个变体中,只要B()返回,amydata数组和5个引用的MyData对象就可以被垃圾回收。但是在第二个变种中,无论是amydata数组还是通过它引用的5个MyData对象都不能被垃圾回收--可能永远不会在应用程序的整个运行时中被回收。

记住: Java垃圾收集器针对许多生命周期较短的对象进行了优化

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53015903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档