考虑内部内存使用情况
input = web_service.FullCompanyListChunksGet(x, ChunkSize);
ReadXML(input);
应该采用与
相同的记忆ReadXML(web_service.FullCompanyListChunksGet(x, ChunkSize));
不是吗?两个样本都只传递了对ReadXML方法的引用吗?
请帮助我理解差异。谢谢
答案 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) {
}
}
编译为(仅separate
和combined
方法):
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));
变量在函数返回时超出范围,因此可以提前进行垃圾回收。