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

Java-在另一个方法中使用返回值作为参数-内存管理,java,memory-management,Java,Memory Management,考虑内存使用 input = web_service.FullCompanyListChunksGet(x, ChunkSize); ReadXML(input); 应使用与相同的内存 ReadXML(web_service.FullCompanyListChunksGet(x, ChunkSize)); 不是吗?这两个示例是否只传递对ReadXML方法的引用 请帮助我理解其中的区别。谢谢我希望JITted代码基本相同。在字节码中,第一种形式有一个额外的存储/加载,但我会非常惊讶地看到这会带

考虑内存使用

input = web_service.FullCompanyListChunksGet(x, ChunkSize);
ReadXML(input);
应使用与相同的内存

ReadXML(web_service.FullCompanyListChunksGet(x, ChunkSize));
不是吗?这两个示例是否只传递对ReadXML方法的引用


请帮助我理解其中的区别。谢谢

我希望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) {
  }
}
编译为(仅使用
单独的
组合的
方法):


在您的第一个示例中

input = web_service.FullCompanyListChunksGet(x, ChunkSize);
ReadXML(input);
变量输入保持在作用域中,直到包含此代码的块结束。在该区块退出之前,它不符合GC的条件。在这个例子中

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

该变量在函数返回时超出作用域,因此有资格提前进行垃圾收集

@shambleh:有时-有时不是。我当然不想总是为每个中间值创建一个局部变量。不过,有时变量的名称以及调试位也会有所帮助。7:astore_1 8:aload_1是否意味着创建了一个临时副本?好的,它在字节码中有,但我希望使用相同的JITted代码。如果它需要更多的内存(我怀疑),它将只有4或8个字节-足够用于引用。它没有创建字符串的副本。JIT是否不允许注意到该变量将不再被使用,并且(当不在调试器下运行时)更早地将其作为根忽略?@Jon:我认为是的,但如果数据结构更早地被垃圾收集,而不是分配(或之后将其置零)真的很重要(!?!)这意味着您不必依赖于JIT在特定平台上的行为。@rAyt:根据我的经验,这样的事情在实践中产生很大的不同是非常罕见的。如果我有确凿的证据证明引用导致了问题,我只会求助于在堆栈框架中微观管理引用。如果你没有证据,那么这可能是一个过早的优化,浪费你的时间。
ReadXML(web_service.FullCompanyListChunksGet(x, ChunkSize));