之前问了一个相关的问题,两个相互指向对方的对象,是否可以被垃圾回收,通过大家的讨论,最后了解到,由于他们两个没有外部引用指向他们,他们会被一起回收掉。那么另外一种情况,一个对象,只有一个指向自己的引用,这种情况,按道理来说应该和上面的情况类似,这个对象可以被回收,但是实际写一个代码测试,那个对象却怎么都没有被回收,到底是怎么回事呢?代码如下:public class Test
{
private String name;
private Test ref;
public Test(String name)
{
this.name = name;
this.ref = null;
}
public void setRef(Test t)
{
this.ref = t;
}
public void finalize() throws Throwable
{
System.out.println(this.name + " is garbage collected!");
super.finalize();
}
public static void main(String[] args)
{
Test test = new Test("Test object");
test.setRef(test);
System.gc();// 不管叫多少次gc,输出都没有打印对象被回收那句话
System.gc();
System.gc();
System.gc();
System.out.println("Test object is garbage collected?");
}
}
{
private String name;
private Test ref;
public Test(String name)
{
this.name = name;
this.ref = null;
}
public void setRef(Test t)
{
this.ref = t;
}
public void finalize() throws Throwable
{
System.out.println(this.name + " is garbage collected!");
super.finalize();
}
public static void main(String[] args)
{
Test test = new Test("Test object");
test.setRef(test);
System.gc();// 不管叫多少次gc,输出都没有打印对象被回收那句话
System.gc();
System.gc();
System.gc();
System.out.println("Test object is garbage collected?");
}
}
解决方案 »
- 求教java comm串口类的问题
- 求javaSE的一些视频..
- [ssh2.jar包] 用SSH从终端读数据,由于颜色,引起乱码的问题。
- java -jar *.jar用什么程序绑定的问题
- 救命啊,eclipse的debug工具的问题,恳请各位高手赐答
- RMI的服务端怎样获取访问端的IP地址?
- 出学JAVA,关于String和StringBuffer的问题.
- 我想问一个,java.long.object的clone()和isequal()是如何实现的,
- 怎样在字符串后插入一个字符串,要永久改变的(在线等)
- 难道这里的都是菜鸟,我问的问题怎么一个都没人回答`~~
- 055.154-Which statement is true?
- 求学java最最基础的书!谢了
开下面两段代码的区别 运行的话有点危险,机子不好会死机,可以改成晕多少秒结束
看运行结果就知道 class s {
private String str;
public s(){
str = "garbage collected";
}
public void finalize() throws Throwable
{
System.out.println(this.str);
super.finalize();
}
}
new s(); // 没有强引用,会回收
while(true){
System.gc();
}
class s {
private String str;
public s(){
str = "oh I go";
}
public void finalize() throws Throwable
{
System.out.println(this.str);
super.finalize();
}
}
s t = new s();// 不会回收,t就是强引用
while(true){
System.gc();
}
垃圾回收 是反向的 从内存堆对象区 的对象开始 逆向树状搜索有没有强引用
如果没有的就回收
private Test ref; public Test(String name) {
this.name = name;
this.ref = null;
} public void setRef(Test t) {
this.ref = t;
} public void finalize() throws Throwable {
System.out.println(this.name + " is garbage collected!");
super.finalize();
} public static void main(String[] args) {
for (int i = 0; i < 10000000; i++) {
}
Test test = new Test("Test object");
test.setRef(test);
System.gc();
System.out.println("Test object is garbage collected?");
}
}
如A引用B,B引用C,C引用A。
我用JDK1.6,已经被回收了。 public static void main(String[] args) throws InterruptedException {
g();
System.gc();
} private static void g() {
Test test = new Test("Test object");
test.setRef(test);
}
test.setRef(test);把这两句放到一个单独的函数就行了.
这两个对象, 如果没有第三方引用到其中之一, 也就是外界无法访问到这两对象
只有互相引用的话,这两个对象会连在一起成为垃圾,可以被回收测试程序:public class Test
{
public static void main(String[] args)
{
Snoochy snoog = new Snoochy();
snoog = null;
while(true)
System.gc();
}
}class Boochy
{
Snoochy snooch;
public Boochy(Snoochy s)
{
snooch = s;
}
public void finalize()
{
System.out.println("Boochy garbage collected.");
}
}class Snoochy
{
Boochy booch;
public Snoochy()
{
booch = new Boochy(this);
}
public void finalize()
{
System.out.println("Snoochy garbage collected.");
}
}
程序输出:
Boochy garbage collected.
Snoochy garbage collected.