Java - 在另一个方法中使用返回值作为参数 - 内存管理

时间:2009-07-29 14:24:53

标签: java memory-management

考虑内部内存使用情况

input = web_service.FullCompanyListChunksGet(x, ChunkSize);
ReadXML(input);

应该采用与

相同的记忆
ReadXML(web_service.FullCompanyListChunksGet(x, ChunkSize));

不是吗?两个样本都只传递了对ReadXML方法的引用吗?

请帮助我理解差异。谢谢

2 个答案:

答案 0 :(得分:5)

我希望JITted代码几乎相同。在字节码中,第一个表单有一个额外的存储/加载,但是我会非常非常惊讶地发现这会产生真正的不同。第一种形式的优点是它可以使调试更容易 - 但它使代码更加冗长。

编辑:我最初写道,两者创建了相同的字节码,但事实并非如此:

public class Test {
  static void separate() {
    String x = "hello";
    String y = x.toString();
    foo(y);
  }

  static void combined() {
    String x = "hello";
    foo(x.toString());
  }

  static void foo(String x) {
  }
}

编译为(仅separatecombined方法):

static void combined();
  Code:
   0:   ldc #2; //String hello
   2:   astore_0
   3:   aload_0
   4:   invokevirtual   #3; //Method java/lang/String.toString:()Ljava/lang/String;
   7:   invokestatic    #4; //Method foo:(Ljava/lang/String;)V
   10:  return

static void separate();
  Code:
   0:   ldc #2; //String hello
   2:   astore_0
   3:   aload_0
   4:   invokevirtual   #3; //Method java/lang/String.toString:()Ljava/lang/String;
   7:   astore_1
   8:   aload_1
   9:   invokestatic    #4; //Method foo:(Ljava/lang/String;)V

答案 1 :(得分:1)

在你的第一个例子中

input = web_service.FullCompanyListChunksGet(x, ChunkSize);
ReadXML(input);

变量输入保持在范围内,直到包含此代码的块结束。在该块退出之前,它不符合GC的条件。在这个例子中

ReadXML(web_service.FullCompanyListChunksGet(x, ChunkSize));

变量在函数返回时超出范围,因此可以提前进行垃圾回收。