垃圾内存支持的java编码标准

时间:2011-03-12 10:26:40

标签: java jvm heap-memory memory-management

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 个答案:

答案 0 :(得分:1)

为什么不读一些关于Java垃圾收集的事情而不是争论:)?例如http://www.ibm.com/developerworks/java/library/j-jtp11253/http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html

那里有所谓的 root set 的定义,它基本上由静态引用组成(你的代码中没有,因为static int不是引用)或栈在执行方法期间,本地变量(Integer i / Integer j / Integer result)以及参数(整数a /整数b)。因此,在执行getObject()期间,i,j ans结果引用的对象将成为根集的一部分,并且不符合gc的条件(以及可能由这些对象间接引用的任何对象)。一旦getObject()结束,我和j的对象就可以被删除了。如果将结果对象分配给另一个局部变量,即结果对象将保留在根集中,即如果您执行Object o = aSimpleClass.getObject()之类的操作。

答案 1 :(得分:1)

让我们看看。

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;

我们结束方法 - 所以现在它的所有局部变量(ijresult)都已结束。返回20对象(在result中),因此现在负责调用方法。 10对象(在j)中不再引用此线程(至少在我们看到的代码中没有引用),因此它可以被释放 - 但如上所述,通常是Integer class保留对这个对象的引用,所以这里没有垃圾收集。

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

请在发布代码时,至少先通过编译器运行它。它是Integerreturn

}