стандарт кодирования Java для поддержки мусорной памяти - PullRequest
1 голос
/ 12 марта 2011
simpleClass sc =  new simpleClass();
sc.getObject();
...

simpleClass.java

    class simpleClass {

    static int st = 0;

    public Integer getObject() {
        Integer i = 10;
        Integer j = 10;
        Integer result = 10;

        try {
            result = getSum(i, j);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            i = null;
        }
        return result;
    }

    public Integer getSum(Integer a, Integer b) {
        return a + b;
    }
}

Объясните, пожалуйста, какая переменная / объект подходит для мусора, а когда ?

которые остаются в памяти до какого времени?

что делать для объекта, который имеет право на память мусора, но все еще находится в памяти?

До тех пор, пока в памяти находится жизньи впечатление.

мои друзья и я уже спорили об этом и продолжаем так много разных заявлений.

Ответы [ 2 ]

1 голос
/ 12 марта 2011

Давайте посмотрим.

class simpleClass {
   static int st = 0;

Переменная st вообще не используется - это намеренно?

   public Integer getObject(){
          Interger i = 10;
          Interger j = 10;
          Interger result = 10;

Я полагаю, это должно быть Integer.Итак, здесь вы создаете 3 переменные и присваиваете им все один и тот же объект, а именно результат из Integer.valueOf(10).Этот метод гарантированно возвращает один и тот же объект для одного и того же ввода, по крайней мере, для небольших значений.Я думаю, что эти значения обычно хранятся в статическом массиве в классе Integer.

          try{    
              result = getSum(i, j);

Здесь вы вызываете метод getSum - это (если исправлено) возвращает другой объект, который совпадает с Integer.valueOf(20).

          }catch(Exception ex){
              ex.printStackTrace();

Если было исключение (это не так, если вы не переопределяете метод sum в подклассе), вы бы здесь перехватили и напечатали объект исключения, а затем бросили егопрочь.

Итак, для сбора мусора доступен один объект (и содержащиеся в нем объекты трассировки стека).

          } finally{
              i = null;

Здесь вы присваиваете null переменной i.Если бы i содержал объект, на который ссылались только через i, теперь он был бы доступен для сборки мусора, но поскольку он также находится в переменной j (и предположительно также где-то в статической переменной в Integer), это не так.

          }
          return result;

Мы заканчиваем метод - так что теперь все его локальные переменные (i, j, result) заканчиваются.Объект 20result) возвращается, таким образом, теперь ответственность за вызывающий метод.На объект 10j) больше не ссылаются из этого потока (по крайней мере, не в коде, который мы видим), поэтому он может быть освобожден - но, как сказано, обычно класс Integer сохраняет ссылку на этообъект, так что здесь нет сборки мусора.

   }
   public Interger getSum(Interger a, Interger b){
         retrun a  + b;
   }

Пожалуйста, при публикации кода хотя бы запускайте его через компилятор.Это Integer и return.

}
1 голос
/ 12 марта 2011

Почему бы не прочитать некоторые вещи о сборке мусора Java вместо споров :)?Например, http://www.ibm.com/developerworks/java/library/j-jtp11253/ или http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html.

Там есть определения для так называемого корневого набора , который по существу состоит из статических ссылок (которых у вас нетв вашем коде, поскольку static int не является ссылкой) или переменные стека, которые являются локальными (Integer i / Integer j / Integer result), а также параметрами (целое число a / целое число b) во время выполнения метода.Таким образом, во время выполнения getObject() объекты, на которые ссылается i, j и result, будут частью корневого набора и не будут иметь права на gc (а также любые объекты, на которые они могут косвенно ссылаться).Как только однажды getObject() закончится, объекты i и j могут быть удалены.Объект результата останется в корневом наборе, если он назначен другой локальной переменной, т. Е. Если вы сделаете что-то вроде Object o = aSimpleClass.getObject().

...