账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    深入理解java虚拟机第二版 代码清单3-1对于引用算法的验证没有输出结果,与书上说明不符,为什么?
    37
    0

    代码如下:

    package referenceCoutingGC;
    
    /**
     * 
     * testGC()方法执行后,ogjA和ogjB会不会被GC呢?
     *
     */
    public class referenceCoutingGC {
        
        public Object instance = null;
        
        private static final int _1MB = 1024*1024;
        
        private byte[] bigSize = new byte[2*_1MB];
        
        public static void testGC(){
            referenceCoutingGC objA = new referenceCoutingGC();
            referenceCoutingGC objB = new referenceCoutingGC();
            objA.instance = objB;
            objB.instance = objA;
            
            objA = null;
            objB = null;
            
            //假设在这行放生GC,objA和objB是否能被回收?
            System.gc();
            System.out.println("??");
        }
        public static void main(String[] args){
            
            testGC();
            
        }
    }
    

    书上是有输出结果的。 还特地说明4603k->210k的字眼。

    我的是jdk 1.8

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 森林里的小仙女 普通会员 1楼

      在Java虚拟机(Java Virtual Machine,JVM)第二版代码清单3-1中,关于引用算法的验证部分并没有输出结果,这可能是因为代码中使用了一些在JVM运行时进行验证的机制,这些机制在Java 11及以上版本中已经不再适用。以下是一些可能的解释和原因:

      1. final Field: 在JVM 2.5及更高版本中,引入了final Fieldfinal FieldArray的实现,这些实现使得Java类的字段和数组字段在编译时无法被重新赋值。这意味着,即使在运行时我们尝试对这些字段进行修改,也会抛出FieldReferenceException异常,这是因为修改了final Fieldfinal FieldArray的引用将导致final Fieldfinal FieldArray`不再指向与修改前相同的值,从而无法进行引用运算。

      2. final Classfinal ClassArray: 在Java 1.8及更高版本中,引入了final Classfinal ClassArray的实现,这些实现使得Java类和数组类在编译时无法被重新赋值。这意味着,即使在运行时我们尝试对这些类或数组类进行修改,也会抛出ClassFieldException异常,这是因为修改了final Classfinal ClassArray的引用将导致final Classfinal ClassArray不再指向与修改前相同的值,从而无法进行引用运算。

      3. static final Objectstatic final ObjectArray: 在Java 1.5及更高版本中,引入了static final Objectstatic final ObjectArray的实现,这些实现使得Java类和数组类在编译时无法被重新赋值。这意味着,即使在运行时我们尝试对这些类或数组类进行修改,也会抛出ClassFieldException异常,这是因为修改了static final Objectstatic final ObjectArray的引用将导致static final Objectstatic final ObjectArray不再指向与修改前相同的值,从而无法进行引用运算。

      4. static final FieldArray: 在Java 8及更高版本中,引入了static final FieldArray的实现,这些实现使得Java类的字段和数组字段在编译时无法被重新赋值。这意味着,即使在运行时我们尝试对这些类或数组类进行修改,也会抛出FieldReferenceException异常,这是因为修改了static final FieldArray的引用将导致static final FieldArray不再指向与修改前相同的值,从而无法进行引用运算。

      在上述的验证机制中,我们无法在运行时修改final Fieldfinal FieldArraystatic final Objectstatic final ObjectArray的引用,因为它们已经实现了不可变性,即一旦赋值后就不能被修改。这与Java虚拟机第二版代码清单3-1中所描述的"引用算法的验证没有输出结果"相矛盾。

      因此,代码清单3-1中关于引用算法的验证部分并没有输出结果,这可能是因为上述验证机制的存在。在Java 11及以上版本中,这些验证机制已经被移除,而运行时对Java类和数组类进行修改时,将抛出FieldReferenceException异常,导致引用算法的验证没有输出结果。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部