问题描述
直接写例子:packagecom.test;publicclasstest{publictest(){//TODOAuto-generatedconstructorstub}publicclassnothing{Stringhah;nothing(Stringhh){hah=hh;}}publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubtesttt=newtest();nothingll=tt.newnothing("uno");Stringlll=ll.hah;ll=null;System.gc();System.out.println(lll);}}上例中ll一开始所引用的对象会被释放吗?
解决方案
解决方案二:
这个是会释放的.类对类成员的管理也只是保留了类成员的引用而已.而类成员并没有反向引用类.所以对类设置NULL后,没有指向该类的引用了.所以该类可以被回收.
解决方案三:
tt.newnothing("uno");这里创建的对象是会被释放的。但你可能理解错了?因为即使ll=null;System.gc();ll对应的内存对象立刻被释放掉,后面System.out.println(lll);依然可以打印出"uno",因为ll.hah也只是引用了一个String对象,lll同样引用这个String("uno")。虽然ll被清理,但这个String对象还是存在的,它还有一处引用就是lll。你不能从是否打印出null来看ll是否被回收
解决方案四:
会释放的,明显是被释放了啊,没看都设置为null了吗,何况ll是基本类型,会自动制定到内存中,
解决方案五:
不好说,现在我也不确定了
解决方案六:
还是会回收的,因为ll.hah是基本类型
解决方案七:
你可以这样想,如果一个类被释放了,那他的成员变量和方法还会在内存里吗?因为成员类毕竟还是其成员,皮之不存毛将焉附,就是这个道理呀
解决方案八:
引用4楼jintianhen1的回复:
不好说,现在我也不确定了
ll是基本类型?
解决方案九:
||这个对象不会被立即释放掉吧,应该是等GC自己来释放。||=null这里释放的是||指向uno的引用吧
解决方案十:
我把||=null去掉,gc只回收了||这个对象的引用,|||对象依然存在,这是怎么回事?调用system.gc()不是释放当前内存么。
解决方案十一:
如果没有一个引用指向这个对象,java虚拟机就会释放这个垃圾对象,程序员完全不用理会。
解决方案十二:
引用7楼Asura_X_Y_Y的回复:
Quote: 引用4楼jintianhen1的回复:
不好说,现在我也不确定了ll是基本类型?
应该说是简单类型,字符串指向的是引用
解决方案十三:
释放不释放只要自己测试一下就OK了。你可以重写finalize方法,在里面打印提示信息,运行一遍看提示信息是否打印就知道了。
解决方案十四:
忘了说结论了,只要没有引用指向的对象照理说都应该被回收,但是垃圾回收机制什么时候回收也不确定。如果不显示调用System.gc()的话,也不会被回收,但是显示调用肯定被回收,即释放。