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;
}
}请解释有哪些变量/对象符合垃圾处理的条件,以及何时使用?
记忆中的哪一种直到什么时候?
对于符合垃圾内存条件但仍在内存中的对象,该怎么办?
直到记忆中的时候,才是生活和印象。
我和我的朋友们已经就这个问题进行了辩论,而且还在继续发表许多不同的声明。
发布于 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()的操作,则结果对象将保留在根集中。
发布于 2011-03-12 10:56:46
让我们看看。
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)都结束了。返回20对象(在result中),因此现在由调用方法负责。10对象(在j中)不再从这个线程中引用(至少在我们看到的代码中没有引用),因此可以释放它--但是如上所述,Integer类通常保留对该对象的引用,因此这里不存在垃圾收集。
}
public Interger getSum(Interger a, Interger b){
retrun a + b;
}请在发布代码时,至少在之前通过编译器来运行它。是Integer和return。
}https://stackoverflow.com/questions/5281942
复制相似问题