如果当前字节码PC计数器的值已经超出了某个变量的作用域,那这个变量对应的Slot就可以交给其他变量使用。
字节码PC计数器就是程序计数器,程序计数器记录当前线程所执行的字节码的偏移地址。如果这个值超出了某个变量的作用域,那么接下来这个变量就不会再被访问到。
slot的复用会影响到系统的垃圾收集行为:
1、
没有回收b所占的内存,因为在执行System.gc()时,变量b还处于作用域内,虚拟机自然不敢回收b的内存。
2、
b的所用域被限制在了块中,执行System.gc()的时候。b已经不能被访问了。可还是没有被回收。
3、这时在代码块外再加一行代码
果然垃圾被回收了
解释:
程序计数器的值超出了b变量的作用域范围,那b的槽位就会交给其他变量使用
slot复用会打断slot中变量与对象的引用,这种关联被打断后,垃圾回收才会生效。
虽然块中的变量不可能在块外被访问,妥妥的垃圾了,但是slot和对象的关联仍然保持,不会成为垃圾。