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;
}
}
请解释哪个变量/对象符合垃圾资格以及何时?
哪个时间留在记忆中?
如何处理符合垃圾内存但仍在内存中的对象?
直到记忆中,是生命和印象。
我的朋友和我已经为此辩论过,并且还在继续发表这么多不同的陈述。
答案 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;
我们结束方法 - 所以现在它的所有局部变量(i
,j
,result
)都已结束。返回20
对象(在result
中),因此现在负责调用方法。 10
对象(在j
)中不再引用此线程(至少在我们看到的代码中没有引用),因此它可以被释放 - 但如上所述,通常是Integer
class保留对这个对象的引用,所以这里没有垃圾收集。
}
public Interger getSum(Interger a, Interger b){
retrun a + b;
}
请在发布代码时,至少先通过编译器运行它。它是Integer
和return
。
}