Java的垃圾回收
发布网友
发布时间:2024-09-29 15:35
我来回答
共2个回答
热心网友
时间:2024-10-03 06:40
会,不用手动设置,当没有引用能操作到A后,A就可能会被垃圾回收器回收。那样B的引用计数会减少,不过貌似java不是用引用计数来判断是否垃圾回收。追问哦,谢谢。我感觉也是这样,类似于超出作用域的情况了
追答是的,当你操作不到A时候,自然也不能通过A操作到B,所以B的引用计数一定会少的。只是java具体用什么机制来算这个,记不大清了,貌似java编程思想里大概讲有,印象中不是引用计数。
热心网友
时间:2024-10-03 06:41
这个问题情况比较复杂:
比如说你的类A中的private B b;有这个field,有public void setB(B b){this.b=b;}方法
首先 B b = new B();产生一个B的实例b
然后生成类A的实例a1,a2;
a1,a2都调用了a1.setB(b),a2.setB(b)那么此时的两个A实例的内嵌对象b实例上是同一个。
当执行a1=null;时,JVM会在之后的某个时间点执行垃圾回收,回收的时候它发现a1引用的对象中还引用了类型B的实例,而此时a2对象还引用着它,所以JVM此时只是释放了a1的空间,然后断开a1到b的引用指向。此时b被唯一的a2关联。如果再a2=null;这时候由于b没有被引用了,所以也会在之后的某个时间被回收。当然JVM回收的时候还有一种情况是仅仅加上了回收标记,并没有真正的进行垃圾回收资源释放。关于五种垃圾回收算法和不同的提供商的JVM采用哪几种有点区别。准确的说垃圾回收是一种资源释放策略,或者叫机制。并不是完全采用一种回收算法。
关于JVM中对象的生命周期,参考JVM规范。
新生代,原生代,老年代。。。。
影子对象,可捕获的影子对象。。。
关于对象池,Java中的“引用”的真正含义,望自琢磨。追问C++用习惯了,对这个问题有点敏感,谢谢了!