垃圾回收 - java 如何手动回收对象
问题描述
先上代码吧,我的目的是让data这个数据彻底消失
public class Test { public static void main(String[] args) {Data data = new Data();data.num = 10;Data new1 = data;Data new2 = data;new2 = null;data = null;System.out.println(new1.num); }}class Data { int num;}
我知道java的垃圾回收机制,只有有东西还在引用他,他就不会消失,像上面的代码依然能够正常输出10. 但是我想知道该怎么做,能让System.out.println(new1.num);抛出null异常,即彻底没有这个数据 不要说让new1=null就行
问题解答
回答1:你自己都说了'我知道java的垃圾回收机制,只有有东西还在引用他,他就不会消失', 'new1'这个变量还在引用 'new Data()'在堆里那块内存,怎么可能会让他被回收,这样我们写的代码不全是空指针异常。你可以使用WeakReference,而不是强引用。
WeakReference<Data> new1 = new WeakReference(data); Data new2 = data; new2 = null; data = null; System.gc();//告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的 ,所以下面延迟2秒 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(new1.get().num);回答2:
System.gc();
建议JVM执行gc,有可能完全被拒绝。 GC本身是会周期性的自动运行的,由JVM决定运行的时机,而且现在的版本有多种更智能的模式可以选择,还会根据运行的机器自动去做选择,就算真的有性能上的需求,也应该去对GC的运行机制进行微调,而不是通过使用这个命令来实现性能的优化。
回答3:有对象引用即将删除的对象仍然可以置为null
{OutClass outClass1 = new OutClass();OutClass outClass2 = new OutClass();outClass2.outClass = outClass1;outClass1 = null;System.out.print(outClass1); }class OutClass {public OutClass outClass; }回答4:
在你没有理解JMM原理之前,千万不要乱用System.gc(),对象用完obj=null;就可以了。
回答5:答案是不能,这属于JVM规范中未定义的行为,开发者不应该试图手动的去帮助虚拟机回收一个对象。如果是sun的JDK,好像有一个unsafe的包,不过我没用过,不知道有没有这样的API。
相关文章:
1. mysql - thinkphp5 在MAC电脑本地正常,部署LINUX服务器之后,模型不存在2. 老哥们求助啊3. 这是什么情况???4. phpadmin的数据库,可以设置自动变化时间的变量吗?就是不需要接收时间数据,自动变化5. pycharm运行python3.6突然出现R6034问题,请问如何处理?6. PHP类封装的插入数据,总是插入不成功,返回false;7. 想找个php大神仿个网站。8. python执行cmd命令,怎么让他执行类似Ctrl+C效果将其结束命令?9. APP上传到电脑服务器,出现数据上传不完整的问题10. 求救一下,用新版的phpstudy,数据库过段时间会消失是什么情况?
