`
Dreamsture
  • 浏览: 3085 次
  • 性别: 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垃圾回收机制总结

    Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 垃圾回收机制的算法有多种...

    java垃圾回收机制简述

    虽然《Java虚拟机规范》并没有强制要求在方法区实现垃圾回收,但在实际应用中,许多JVM实现了这种方法区的垃圾回收机制。尽管如此,由于方法区中存储的是类的信息、常量、静态变量等数据,因此其回收效率通常较低。 ...

    JAVA垃圾回收机制

    Java垃圾回收机制(GC)是Java编程语言的关键特性,它自动管理内存,释放不再使用的对象,以防止内存泄漏。GC的运作方式主要有两种策略:引用计数和对象引用遍历。 引用计数是一种简单但不完美的方法。每个对象都有...

    Java垃圾回收机制

    本文将深入探讨Java垃圾回收机制的核心原理及其关键技术。 #### 二、Java堆内存 Java的堆是一个运行时数据区,用于存储所有对象实例。这些对象是通过`new`、`newarray`、`anewarray`和`multianewarray`等指令创建...

    垃圾回收机制面试题·.docx

    本文将深入探讨Java中的垃圾回收机制,包括其工作原理、常用算法以及实际应用中的注意事项。 #### 二、垃圾回收的基本概念 **1. 什么是垃圾回收** 垃圾回收(Garbage Collection, GC)是指在程序运行过程中自动...

    Java垃圾回收机制的学习和使用

    Java垃圾回收机制是Java编程中至关重要的一部分,它自动管理内存,释放不再使用的对象,避免内存泄漏,并优化内存使用。Java虚拟机(JVM)的堆内存是存放对象的主要区域,当对象通过new等指令创建后,垃圾回收机制...

    浅谈JAVA垃圾回收机制.pdf

    Java 中的垃圾回收机制主要通过两种算法来判断对象是否可以被回收,即引用计数算法和可达性分析算法。引用计数算法通过给对象中添加一个引用计数器来判断对象是否可以被回收,而可达性分析算法则是通过搜索 GC Roots...

    详细介绍Java垃圾回收机制

    Java垃圾回收机制是Java编程语言的关键特性,负责自动管理程序中的内存,确保程序高效、稳定地运行。在Java虚拟机(JVM)中,垃圾回收的主要任务是识别并清理不再被程序使用的对象,以避免内存泄漏。以下是关于Java...

    java垃圾回收(gc)机制详解.pdf

    在垃圾回收机制中,需要回收的内存主要是指那些不会再被程序使用到的对象所占用的内存空间。简单来说,垃圾回收机制要识别和回收的对象是那些“无用的对象”。无用的对象是指没有任何引用指向它们,因此它们无法再被...

    全面分析Java的垃圾回收机制

    Java的垃圾回收机制是Java虚拟机(JVM)的核心特性之一,它负责自动管理应用程序的内存,特别是对象的生命周期。垃圾回收的主要目标是回收不再被程序引用的对象所占用的内存,以便这部分空间可以被重新利用。 垃圾...

    Java垃圾回收机制.pdf

    Java垃圾回收机制是Java语言中一个重要的特性,它负责自动管理程序中的内存,避免程序员手动进行内存释放,从而降低了内存泄露的风险。与C++不同,Java的垃圾回收是由Java虚拟机(JVM)内置的机制执行的,这使得...

    Java垃圾回收机制e.pdf

    Java垃圾回收机制允许对象在被回收前执行一些必要的清理工作,这通常通过覆盖`finalize()`方法来实现。然而,`finalize()`方法的调用时机并不确定,它会在对象被销毁之前由垃圾收集器调用,用于执行对象的清理操作。...

Global site tag (gtag.js) - Google Analytics