- 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 条
- 全部回答
-
森林里的小仙女 普通会员 1楼
在Java虚拟机(Java Virtual Machine,JVM)第二版代码清单3-1中,关于引用算法的验证部分并没有输出结果,这可能是因为代码中使用了一些在JVM运行时进行验证的机制,这些机制在Java 11及以上版本中已经不再适用。以下是一些可能的解释和原因:
-
final Field: 在JVM 2.5及更高版本中,引入了final Field和final FieldArray的实现,这些实现使得Java类的字段和数组字段在编译时无法被重新赋值。这意味着,即使在运行时我们尝试对这些字段进行修改,也会抛出FieldReferenceException异常,这是因为修改了final Field或final FieldArray的引用将导致final Field或final FieldArray`不再指向与修改前相同的值,从而无法进行引用运算。 -
final Class和final ClassArray: 在Java 1.8及更高版本中,引入了final Class和final ClassArray的实现,这些实现使得Java类和数组类在编译时无法被重新赋值。这意味着,即使在运行时我们尝试对这些类或数组类进行修改,也会抛出ClassFieldException异常,这是因为修改了final Class或final ClassArray的引用将导致final Class或final ClassArray不再指向与修改前相同的值,从而无法进行引用运算。 -
static final Object和static final ObjectArray: 在Java 1.5及更高版本中,引入了static final Object和static final ObjectArray的实现,这些实现使得Java类和数组类在编译时无法被重新赋值。这意味着,即使在运行时我们尝试对这些类或数组类进行修改,也会抛出ClassFieldException异常,这是因为修改了static final Object或static final ObjectArray的引用将导致static final Object或static final ObjectArray不再指向与修改前相同的值,从而无法进行引用运算。 -
static final FieldArray: 在Java 8及更高版本中,引入了static final FieldArray的实现,这些实现使得Java类的字段和数组字段在编译时无法被重新赋值。这意味着,即使在运行时我们尝试对这些类或数组类进行修改,也会抛出FieldReferenceException异常,这是因为修改了static final FieldArray的引用将导致static final FieldArray不再指向与修改前相同的值,从而无法进行引用运算。
在上述的验证机制中,我们无法在运行时修改
final Field、final FieldArray、static final Object或static final ObjectArray的引用,因为它们已经实现了不可变性,即一旦赋值后就不能被修改。这与Java虚拟机第二版代码清单3-1中所描述的"引用算法的验证没有输出结果"相矛盾。因此,代码清单3-1中关于引用算法的验证部分并没有输出结果,这可能是因为上述验证机制的存在。在Java 11及以上版本中,这些验证机制已经被移除,而运行时对Java类和数组类进行修改时,将抛出
FieldReferenceException异常,导致引用算法的验证没有输出结果。 -
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
