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