很多书上说,当某个对象不存在对它的引用的时候即被当做垃圾,有可能被不定时的回收。
但对于那些临时对象或者说一次性的对象比如:
System.out.print("java");
new Dog().someMethod();//字符串对象"java” 和对象dog new 出来并没有赋给某个引用变量
我不明白的是像"java" ,dog这样的对象会不会被当成垃圾,恰恰刚被new出来就被回收了,毕竟垃圾回收器的运行是一个独立的
进程。JVM是怎么处理这种情况的,哪位高手能帮我解惑,谢谢!
但对于那些临时对象或者说一次性的对象比如:
System.out.print("java");
new Dog().someMethod();//字符串对象"java” 和对象dog new 出来并没有赋给某个引用变量
我不明白的是像"java" ,dog这样的对象会不会被当成垃圾,恰恰刚被new出来就被回收了,毕竟垃圾回收器的运行是一个独立的
进程。JVM是怎么处理这种情况的,哪位高手能帮我解惑,谢谢!
引用可以分类
只有弱引用(定义时候进行说明),才最有可能被回收
意味着你下次就不能再找到这一个对象了。
这样的话它到一定时间就会被垃圾回收的。
1 对象可能不被当做垃圾来收集、
2 Garbage collection is not desturction
3 垃圾收集的工作仅仅和存储空间有关
其中java是可能会被JVM当作字符常量放入到资源池中(要看具体的JVM),这样它就没有那么容易被GC销毁掉了。
而dog对象在执行完someMethod()方法后,就完全有可能被GC发现了。
当然GC通常都是有一定的条件触发的,比如定时,内存空间到达某个线等等。
jvm如何保证dog不被不被当成垃圾回收呢!
而dog对象当你new出来以后就没有任何引用指针指向它了
那么它就会被垃圾回收机制回收
但java的垃圾回收机制你无法预知它何时执行
按照设计初衷 java回收机制只会在虚拟机发现内存不够时才会启动
也就是说当你new出dog时调用其方法 系统内存肯定是够用的
所以无需担心它一new出来就被回收掉
空间也不会回收,因为此时对此对象来说java virtual machine 会先运行此对象的finalize()方法.当下一次gc()运行时java virtual machine还要判断是不是没有引用指向该对象,如果是才有可能被回收.这是因为finalize()方法可能会使一个推动引用的对象重新获得引用.当然java的垃圾回收机制是一个很复杂的问题,我以上所说也不完全正确,楼主可以简单的这么认为.