今日思考之 20200614:java 中 null 是否对 gc 有帮助?
先上一张图~~~
(from 《深入理解java虚拟机 第二版》Charter 8.2.1 局部变量表)
如上图中文字描述所说,null 之“奇技”在于对一些栈帧很长的方法来说,提早将前面一些不用的大对象设为 null 确实是可以加速垃圾回收的。
思考1:什么情况下,会有在调用一个耗时长的方法之前可以回收前面的大对象呢?——只有当我们的方法中,有多次调用外部方法,那么我们就可以在每次调用这些外部方法时用“null 的奇技”回收一下这个外部方法中用不到的大对象。
思考2:什么情况下调用外部方法不需要前面的对象?——我猜测是产生了一些中间对象,即对象经过几次“包装”才最终使用,那么中间就有一些“不小不大”的对象产生。
思考3:那什么情况下一个方法中多次调用外部方法?——第一种情况,封装不合理,没有将方法抽象出来,导致方法过长;第二种情况,业务的聚合接口,这类接口需要聚合多方信息,不得不调用多个外部方法,如果产生了过多中间对象(如思考2中所提)那么可以用这个“null 奇技”回收。
思考4:这个“null的奇技淫巧”能够普遍适用吗???(有垃圾代码的嫌疑)
再引用《深入理解java虚拟机 第二版》Charter 8.2.1 局部变量表 中的资料,如下图:
从上图中我们了解到,周志明大大并不赞成将这种“null奇技淫巧”作为一种普遍的编码规则来推广。(它就是有可能成为垃圾代码的)JVM 通过 JIT 已经对这类情况进行了优化。