Java虚拟机使用引用计数来确定对象是否存活?
来源:互联网 发布:大数据应用发展趋势 编辑:程序博客网 时间:2024/06/10 17:11
很多人都认为Java的内存管理机制使用的是引用计数这样的方式来确定一个对象是否存活:大致意思就是,为每个对象设定一个引用计数,当该对象被引用则该计数+1,解除引用的时候该计数-1,则当计数为0时则该对象即可被释放,否则认为该对象不能被清理。
然而,遇到这样的问题又会怎么样呢?
/***Using java -Xmx8M -Xms8m OutOfMemory*to run this demo*/class OutOfMemory{private static int SIZE_1MB = 1024*1024;private byte[] data = new byte[SIZE_1MB];public static void main(String args[]){int i;Object objs[] = new Object[100];for(i=0;i<100;i++){objs[i] = new OutOfMemory();}}}
通过为java命令设定参数,设定堆大小为8m,那么,很明显,这个程序会因为内存不足而挂掉。
这便是Java堆中内存不足,而现有的对象均不可被GC清理(因为每个对象实例的引用都还没解除,也就是引用计数不为0),故因内存不足而死掉。
而如果把程序改成这样:
/***Using java -Xmx8M -Xms8m OutOfMemory2*to run this demo*/class OutOfMemory2{private static int SIZE_1MB = 1024*1024;private byte[] data = new byte[SIZE_1MB];public static void main(String args[]){int i;Object obj;for(i=0;i<100;i++){obj = new OutOfMemory();}}}
而遇到这样一个程序 的时候,情况就不一样了:
/** * @author hackeris * Using java -Xmx8M -Xms8m IsGCUsingReferenceCounting *to run this demo */public class IsGCUsingReferenceCounting { public Object referenceOfAnotherObject = null; private static final int SIZE_1MB = 1024 * 1024; private byte[] data = new byte[SIZE_1MB]; public static void main(String args[]) { int i; for (i = 0; i < 100; i++) { testGC();// System.gc(); } } public static void testGC() { IsGCUsingReferenceCounting obj1 = new IsGCUsingReferenceCounting(); IsGCUsingReferenceCounting obj2 = new IsGCUsingReferenceCounting(); obj1.referenceOfAnotherObject = obj2; obj2.referenceOfAnotherObject = obj1; }}
如果GC是通过引用计数来确定对象是否存活,那么这个程序就无法正常的结束,必然会因为内存不足而挂掉。在testGC函数中,obj1持有obj2的引用,obj2持有obj1的引用,因此两个对象的引用计数均不为0,故在函数testGC退出的时候,它们由于相互引用,其引用计数均不会减少,那么这样的情况下,GC便无法将其清理,使得最终程序会因为内存不足而挂掉。
但我们实际运行这个程序的时候却一切风平浪静,GC能够应对这样的相互引用的情况,可以看出,GC并非使用单纯的引用计数来确定一个对象是否存活,而是采用了更加高明的策略。
笔者使用的Java环境如下:
java version "1.7.0_51"Java(TM) SE Runtime Environment (build 1.7.0_51-b13)Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
0 0
- Java虚拟机使用引用计数来确定对象是否存活?
- Java对象是否存活之引用计数算法&可达性分析算法
- 深入理解Java虚拟机笔记---判断对象是否存活
- 深入理解Java虚拟机笔记---判断对象是否存活
- java虚拟机中如何判断对象是否存活
- 深入理解Java虚拟机之判断对象是否存活
- java 对象存活分析——引用计数法&可达性分析
- java中对象的引用类型及判断对象是否存活的算法
- 深入Java虚拟机--判断对象存活状态
- java虚拟机(三)---对象存活
- 判断Java对象是否存活的方法
- 判断Java对象是否存活的方法
- 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用
- 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用
- 对象是否存活
- 虚拟机对象是否还有引用
- [深入理解Java虚拟机]第三章 对象存活判定算法
- 深入理解Java虚拟机之对象存活算法的实现
- 在openstack neutron中使用VxLAN
- linux下阅读源代码的工具
- MTD原始设备与FLASH硬件驱动的对话
- Linux显示机器的处理器架构
- leetcode_Longest Common Prefix_easy
- Java虚拟机使用引用计数来确定对象是否存活?
- 奇怪的Javascript(持续更新)
- bzoj2223: [Coci 2009]PATULJCI 主席树
- openssl 非对称加密DSA,RSA区别与使用介绍(转)
- 9、Palindrome Number
- centos中添加DNS,添加网关等命令小结
- ASCII码对应表chr(9)、chr(10)、chr(13)、chr(32)、chr(34)、chr(39)、chr(..
- openstack网络模式之vlan分析
- 关于指针的复习