首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾内存支持的java编码标准

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

Stack Overflow用户
提问于 2011-03-12 10:26:39
回答 2查看 132关注 0票数 1
代码语言:javascript
复制
simpleClass sc =  new simpleClass();
sc.getObject();
...

simpleClass.java

代码语言:javascript
复制
    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;
    }
}

请解释有哪些变量/对象符合垃圾处理的条件,以及何时使用

记忆中的哪一种直到什么时候?

对于符合垃圾内存条件但仍在内存中的对象,该怎么办?

直到记忆中的时候,才是生活和印象。

我和我的朋友们已经就这个问题进行了辩论,而且还在继续发表许多不同的声明。

EN

回答 2

Stack Overflow用户

发布于 2011-03-12 10:53:32

为什么不阅读一些关于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),以及执行方法时的参数(Integer / Integer )。因此,在执行getObject()期间,i、j和ans结果引用的对象将是根集的一部分,不符合gc的条件(以及可能被这些对象间接引用的任何对象)。但是,一旦getObject()完成之后,i's和j的对象就可以被删除。如果将结果对象分配给另一个局部变量,即执行类似于Object o = aSimpleClass.getObject()的操作,则结果对象将保留在根集中。

票数 1
EN

Stack Overflow用户

发布于 2011-03-12 10:56:46

让我们看看。

代码语言:javascript
复制
class simpleClass {
   static int st = 0;

根本没有使用st变量--这是有意的吗?

代码语言:javascript
复制
   public Integer getObject(){
          Interger i = 10;
          Interger j = 10;
          Interger result = 10;

我想这些应该是Integer。因此,这里您创建了3个变量,并为它们分配所有相同的对象,即来自Integer.valueOf(10)的结果。该方法保证为相同的输入返回相同的对象,至少对于较小的值。我认为,它通常将这些值存储在Integer类中的静态数组中。

代码语言:javascript
复制
          try{    
              result = getSum(i, j);

在这里调用getSum方法-这个方法(如果更正的话)返回另一个对象,它与Integer.valueOf(20)相同。

代码语言:javascript
复制
          }catch(Exception ex){
              ex.printStackTrace();

如果存在异常(如果不覆盖子类中的sum方法,则不是异常),则在这里捕获并打印异常对象,然后将其丢弃。

因此,有一个对象(及其包含的堆栈跟踪对象)可用于垃圾收集。

代码语言:javascript
复制
          } finally{
              i = null;

在这里,您将null分配给i变量。如果i包含一个仅通过i引用的对象,那么它现在就可以用于垃圾收集,但是由于它也在j变量中(而且据说也在Integer中的静态变量中),所以它不是。

代码语言:javascript
复制
          }
          return result;

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

代码语言:javascript
复制
   }
   public Interger getSum(Interger a, Interger b){
         retrun a  + b;
   }

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

代码语言:javascript
复制
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5281942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档