Java - использование возвращаемого значения в качестве параметра в другом методе - Управление памятью - PullRequest
2 голосов
/ 29 июля 2009

с учетом использования внутренней памяти

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

должен занимать ту же память, что и

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

Не так ли? Оба образца передают только ссылку на метод ReadXML?

Пожалуйста, помогите мне понять разницу. Спасибо

Ответы [ 2 ]

5 голосов
/ 29 июля 2009

Я ожидаю, что код 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 голос
/ 29 июля 2009

В вашем первом примере

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

переменная ввода остается в области действия до конца блока, содержащего этот код. Он не подходит для GC до выхода из этого блока. В этом примере

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

переменная выходит из области видимости при возврате функции, поэтому имеет право на сборку мусора ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...