`
Dreamsture
  • 浏览: 3043 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

JAVA中使用引用计数技术来实现垃圾回收机制

    博客分类:
  • JAVA
阅读更多
根据自己对JAVA的学习理解,解释一下引用计数技术,有什么不对的请大家指正。以人吃苹果为例,代码如下:
package com.test11;


/**
 * 测试对象的销毁
 * @author Administrator
 *
 */
public class Apple{
	/**
	 * 属性
	 */
	private int refCount = 0;//某个引用被使用的次数
	private static long counter = 0;//引用的个数
	private final long id = counter++;//引用的id
	
	/**
	 * 构造器
	 */
	public Apple(){
		System.out.println("买了个苹果\t apple"+id);
	}
	/**
	 * 某个引用,每被使用一次引用次数加一
	 */
	public void addRef(){
		refCount++;
	}
	/**
	 * 销毁对象
	 */
	protected void dispose(){
		if(--refCount==0){
			System.out.println("所有人吃完了苹果apple"+id+",现在丢掉苹果核!");
			counter--;
		}else{
			System.out.println("其他人还没吃完苹果,苹果先不销毁!");
		}
	}
	/**
	 * get方法
	 */
	public int getRefCount() {
		return refCount;
	}
	public static long getCounter() {
		return counter;
	}
	public long getId() {
		return id;
	}
}


----------------------------------------------------------------
package com.test11;


/**
 * 测试对象的销毁
 * @author Administrator
 *
 */
public class Person{
	/**
	 * 属性
	 */
	private Apple apple;
	private static long counter = 0;//引用的个数
	private final long id = counter++;//引用的id
	private String name;
	
	/**
	 * 构造器
	 */
	public Person(Apple apple,String name){
		this.apple = apple;
		this.name = name;
		System.out.println(name+"走进了小屋中!");
		this.apple.addRef();
	}
	/**
	 * 销毁对象
	 */
	protected void dispose(){
			System.out.println(name+"走出了小屋!");
			apple.dispose();
	}
	/**
	 * 吃苹果
	 */
	protected void eatApple(){
		System.out.println(name+"吃了一口苹果!");
	}
	/**
	 * get方法
	 */
//	public int getApple() {
//		return apple;
//	}
	public long getCounter() {
		return counter;
	}
	public long getId() {
		return id;
	}
}


----------------------------------------------------------------

package com.test11;

/**
 * 使用引用计数技术对对象的销毁
 * 
 * @author Administrator
 * 
 */
public class Test {

	public static void main(String[] args) {
		/**
		 * 现在要在一个小屋内(内存)给人(对象)发苹果(对象)吃!
		 */
		// 先创建两个苹果
		Apple apple0 = new Apple();
		Apple apple1 = new Apple();
		System.out.println("**********************************************************");
		System.out.println("现在的苹果数量为:"+Apple.getCounter());
		System.out.println("苹果apple0被引用的数量为:"+apple0.getRefCount());
		System.out.println("苹果apple1被引用的数量为:"+apple1.getRefCount());
		System.out.println("**********************************************************");
		// 创建一群人(五个人),将苹果apple0发给这群人吃(每个人只能吃一口)
		Person[] persons = { new Person(apple0,"张三"), new Person(apple0,"李四"),
				new Person(apple0,"王五"), new Person(apple0,"赵六"), new Person(apple0,"刘齐") };
		
		System.out.println("**********************************************************");
		System.out.println("现在的苹果数量为:"+Apple.getCounter());
		System.out.println("苹果apple0被引用的数量为:"+apple0.getRefCount());
		System.out.println("苹果apple1被引用的数量为:"+apple1.getRefCount());
		System.out.println("**********************************************************");
		
		for(Person p:persons){
			p.eatApple();
			p.dispose();//吃完苹果的人,要从小屋中出去(销毁对象释放内存)
		}
		System.out.println("**********************************************************");
		System.out.println("现在的苹果数量为:"+Apple.getCounter());
		System.out.println("苹果apple0被引用的数量为:"+apple0.getRefCount());
		System.out.println("苹果apple1被引用的数量为:"+apple1.getRefCount());
		System.out.println("**********************************************************");
	}
}



=====================运行结果如下=========================
买了个苹果 apple0
买了个苹果 apple1
**********************************************************
现在的苹果数量为:2
苹果apple0被引用的数量为:0
苹果apple1被引用的数量为:0
**********************************************************
张三走进了小屋中!
李四走进了小屋中!
王五走进了小屋中!
赵六走进了小屋中!
刘齐走进了小屋中!
**********************************************************
现在的苹果数量为:2
苹果apple0被引用的数量为:5
苹果apple1被引用的数量为:0
**********************************************************
张三吃了一口苹果!
张三走出了小屋!
其他人还没吃完苹果,苹果先不销毁!
李四吃了一口苹果!
李四走出了小屋!
其他人还没吃完苹果,苹果先不销毁!
王五吃了一口苹果!
王五走出了小屋!
其他人还没吃完苹果,苹果先不销毁!
赵六吃了一口苹果!
赵六走出了小屋!
其他人还没吃完苹果,苹果先不销毁!
刘齐吃了一口苹果!
刘齐走出了小屋!
所有人吃完了苹果apple0,现在丢掉苹果核!
**********************************************************
现在的苹果数量为:1
苹果apple0被引用的数量为:0
苹果apple1被引用的数量为:0
**********************************************************
1
3
分享到:
评论

相关推荐

    JAVA垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再...

    谈谈你对垃圾回收机制的了解?.docx

    在系统运行过程中会产生一些无用的对象,这些对象一直占用内存,不清理这些无用的对象可能会导致内存耗尽,所有垃圾回收机制的是内存. 垃圾收集的原理和概念 对于对象实例收集.主要有两种基本算法,引用计数算法,可达性...

    详细介绍Java垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再...

    Java+JVM+垃圾回收机制

    该资源通过图像及文字详细分析回答了JVM垃圾回收机制的三个重要面试问题: 1.哪些垃圾是需要回收的? 判断对象是否需要回收有两种算法。一种是引用计数算法、一种是可达性分析算法。 2.有哪些重要的垃圾回收算法? ...

    java高级工程师、技术专家、架构师、项目经理面试宝典.rar

    注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,2、GC回收机制的两种算法,a、引用计数法 b、可达性分析算法 年轻代:是所有新对象产生的地方。 年老代:在年轻代中经历了N次回收后仍然...

    java虚拟机知识点整理

    1 标记-清除算法:首先标记所有需要回收的对象(引用计数或可达性分析算法标记),在标记完成后统一回收所有被标记的对象。 缺点:效率问题,标记和清除两个过程效率都不高,另一个是清除之后会产生大量不连续的内存...

    java面试题

    63.2. 几种垃圾回收机制 43 63.2.1. 标记-清除收集器 43 63.2.2. 标记-压缩收集器 43 63.2.3. 复制收集器 44 63.2.4. 增量收集器 44 63.2.5. 分代收集器 44 63.2.6. 并发收集器 44 63.2.7. 并行收集器 44 63.3. ...

    JavaScript中的垃圾回收与内存泄漏示例详解

    为了更好避免内存泄漏,我们先介绍Javascript垃圾回收机制。 在C与C++等语言中,开发人员可以直接控制内存的申请和回收。但是在Java、C#、JavaScript语言中,变量的内存空间的申请和释放都由程序自己处理,开发人员...

    Java虚拟机

    3.2.1 引用计数算法 3.2.2 可达性分析算法 3.2.3 再谈引用 3.2.4 生存还是死亡 3.2.5 回收方法区 3.3 垃圾收集算法 3.3.1 标记-清除算法 3.3.2 复制算法 3.3.3 标记-整理算法 3.3.4 分代收集算法 3.4 ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 44 3.2.1 引用计数算法 / 44 3.2.2 根搜索算法 / 46 3.2.3 再谈引用 / 47 3.2.4 生存还是死亡? / 48 3.2.5 回收方法区 / 50 3.3 垃圾收集算法 / 51 3.3.1 标记 -清除算法 / 51 3.3.2 复制算法 / 52 ...

    操作系统(内存管理)

    文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...

    Android中的内存泄漏

    垃圾回收机制分为:引用计数法、可达性分析法 引用计数法(有循环引用的问题):Python、Object-C、Swift 用一个计数器记录一个对象被引用的次数,如果引用的次数被减少到0,说明这个对象是垃圾对象 可达性分析法:...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【Mybatis】MyBatis中使用#和$书写占位符有什么区别? 100 【Mybatis】Mybatis是如何进行分页的?分页插件的原理是什么? 100 【数据库】什么是事务?事务的四个特性?事务的隔离级别?什么是脏读,不可重复读,幻读...

    resin-jvm 调优

    2.几种垃圾回收机制 2.1.标记-清除收集器 这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。 2.2.标记-压缩收集器 ...

    Java 虚拟机面试题全面解析(干货)

    Java 虚拟机面试题全面解析,《深入理解Java虚拟机》干货版,自己总结,希望能够帮助大家,免费下载~什么是类加载机制? 虚拟机和物理机的区别是什么? 运行时栈帧结构 Java方法调用 什么是方法调用? Java的方法调用,...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第33节垃圾回收-判断对象是否存活算法-引用计数法详解00:14:08分钟 | 第34节垃圾回收-判断对象是否存活算法-可达性分析法详解00:07:09分钟 | 第35节垃圾回收算法-标记清除算法00:04:36分钟 | 第36节垃圾回收算法-...

    Java系列技术之JVM调优

    该课程主要讲解Java JVM方面的知识,包括堆内存、内存溢出、泄漏、垃圾回收机制、引用计数垃圾回收算法等所有知识点。Java虚拟机应该说是学习到一定程度的Java程序员必须要学习的内容,我们自己写的程序最终都会发布...

    Flex企业应用开发实战源代码

    10.2 在Flex中使用Flash CS所开发的控件 306 10.3 Flex访问.Net 308 10.3.1 Fluorine的安装和配置 309 10.3.2 Flex通过Fluorine访问.NET 311 10.4 小结 314 附录 Flex Builder 3中的项目如何迁移至Flash ...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第33讲 垃圾回收-判断对象是否存活算法-引用计数法详解 00:14:08  第34讲 垃圾回收-判断对象是否存活算法-可达性分析法详解 00:07:09  第35讲 垃圾回收算法-标记清除算法 00:04:36  第36讲 垃圾回收算法-...

    java核心知识点整理.pdf

    引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析..........................

Global site tag (gtag.js) - Google Analytics