iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一文带你回顾Java中的垃圾回收机制
  • 253
分享到

一文带你回顾Java中的垃圾回收机制

2024-04-02 19:04:59 253人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录介绍重要条款:使对象符合 GC 条件的方法请求JVM运行垃圾收集器的方式定稿让我们举一个真实的例子,在那里我们使用垃圾收集器的概念。 现在获得正确的输出: 总结介绍 在 C/C+

介绍

C/C++ 中,程序员负责对象的创建和销毁。通常程序员会忽略无用对象的销毁。由于这种疏忽,在某些时候,为了创建新对象,可能没有足够的内存可用,整个程序将异常终止,导致OutOfMemoryErrors。

但是在 Java 中,程序员不需要关心所有不再使用的对象。垃圾回收机制自动销毁这些对象。

垃圾回收机制是守护线程的最佳示例,因为它始终在后台运行。

垃圾回收机制的主要目标是通过销毁无法访问的对象来释放堆内存。

重要条款:

无法访问的对象: 如果一个对象不包含对它的任何引用,则称其为无法访问的对象。另请注意,属于隔离岛的对象也无法访问。


Integer i = new Integer(4);
// 新的 Integer 对象可通过 'i' 中的引用访问
i = null;
// Integer 对象不再可用。

垃圾回收的资格: 如果对象无法访问,则称该对象有资格进行 GC(垃圾回收)。在上图中,在i = null 之后; 堆区域中的整数对象 4 有资格进行垃圾回收。

使对象符合 GC 条件的方法

即使程序员不负责销毁无用的对象,但如果不再需要,强烈建议使对象不可访问(因此有资格进行 GC)。

通常有四种不同的方法可以使对象适合垃圾回收。

  1. 取消引用变量
  2. 重新分配引用变量
  3. 在方法内部创建的对象
  4. 隔离岛

以上所有带有示例的方法都在单独的文章中讨论:如何使对象符合垃圾收集条件

请求JVM运行垃圾收集器的方式

一旦我们使对象符合垃圾收集条件,垃圾收集器可能不会立即销毁它。每当 JVM 运行垃圾收集器程序时,只会销毁对象。但是当JVM运行Garbage Collector时,我们无法预料。

我们还可以请求 JVM 运行垃圾收集器。有两种方法可以做到:

  1. 使用System.gc() 方法:系统类包含静态方法gc() 用于请求 JVM 运行垃圾收集器。
  2. 使用Runtime.getRuntime().gc() 方法:运行时类允许应用程序与运行应用程序的 JVM 交互。因此,通过使用其 gc() 方法,我们可以请求 JVM 运行垃圾收集器。

// 演示请求 JVM 运行垃圾收集器的 Java 程序
public class Test
{
	public static void main(String[] args) throws InterruptedException
	{
		Test t1 = new Test();
		Test t2 = new Test();
		
		// 取消引用变量
		t1 = null;
		
		// 请求 JVM 来运行垃圾收集器
		System.gc();
		
		// 取消引用变量
		t2 = null;
		
		// 请求 JVM 来运行垃圾收集器
		Runtime.getRuntime().gc();
	
	}
	
	@Override
	// 在垃圾回收之前,在对象上调用一次 finalize 方法
	protected void finalize() throws Throwable
	{
		System.out.println("垃圾收集器调用");
		System.out.println("对象垃圾收集:" + this);
	}
}

输出:

垃圾收集器调用
对象垃圾收集:haiyong.Test@7ad74083
垃圾收集器调用
对象垃圾收集:haiyong.Test@7410a1a9

笔记

  • 不能保证以上两种方法中的任何一种都一定会运行垃圾收集器。
  • 调用System.gc() 等效于调用:Runtime.getRuntime().gc()

定稿

就在销毁对象之前,垃圾收集器调用对象的finalize() 方法来执行清理活动。一旦finalize() 方法完成,垃圾收集器就会销毁该对象。

finalize() 方法存在于具有以下原型的Object 类中。


protected void finalize() throws Throwable

根据我们的要求,我们可以覆盖finalize() 方法来执行我们的清理活动,例如关闭数据库连接。

笔记 :

  1. 垃圾收集器而不是JVM调用的finalize() 方法。虽然垃圾收集器是JVM的模块之一。
  2. 对象类 finalize() 方法有空实现,因此建议覆盖finalize() 方法来处理系统资源或执行其他清理。
  3. 对于任何给定的对象,finalize() 方法永远不会被多次调用。
  4. 如果finalize() 方法抛出未捕获的异常,则忽略该异常并终止该对象的终结。

有关finalize() 方法的示例,请参阅Java 程序的输出第十套之垃圾收集

让我们举一个真实的例子,在那里我们使用垃圾收集器的概念。

假设你去字节跳动实习,他们告诉你写一个程序,计算在公司工作的员工人数(不包括实习生)。要制作这个程序,你必须使用垃圾收集器的概念。

这是您在公司获得的实际任务:-

问: 编写一个程序来创建一个名为 Employee 的类,该类具有以下数据成员。

1.一个ID,用于存储分配给每个员工的唯一ID。

2.员工姓名。

3.员工年龄。

另外,提供以下方法-

  1. 用于初始化名称和年龄的参数化构造函数。ID 应在此构造函数中初始化。
  2. 显示 ID、姓名和年龄的方法 show()。
  3. 显示下一个员工的 ID 的方法 showNextId()。

现在对垃圾回收机制不了解的初学者可能会这样编写代码:


//计算在公司工作的员工人数的程序

class Employee
{
	private int ID;
	private String name;
	private int age;
	private static int nextId=1;
	//它是静态的,因为它在所有对象之间保持通用并由所有对象共享
	public Employee(String name,int age)
	{
		this.name = name;
		this.age = age;
		this.ID = nextId++;
	}
	public void show()
	{
		System.out.println
		("Id="+ID+"\nName="+name+"\nAge="+age);
	}
	public void showNextId()
	{
		System.out.println
		("Next employee id will be="+nextId);
	}
}
class UseEmployee
{
	public static void main(String []args)
	{
		Employee E=new Employee("GFG1",33);
		Employee F=new Employee("GFG2",45);
		Employee G=new Employee("GFG3",25);
		E.show();
		F.show();
		G.show();
		E.showNextId();
		F.showNextId();
		G.showNextId();
			
			{ //这是保留所有实习生的子块。
			Employee X=new Employee("GFG4",23);	
			Employee Y=new Employee("GFG5",21);
			X.show();
			Y.show();
			X.showNextId();
			Y.showNextId();
		}
		//这个大括号之后,X 和 Y 将被移除。因此现在它应该显示 nextId 为 4。
		E.showNextId();//这一行的输出应该是 4,但它会给出 6 作为输出。
	}
}

输出:

现在获得正确的输出:

现在垃圾收集器(gc)将看到 2 个空闲的对象。现在递减 nextId,gc(garbage collector) 只会在我们的程序员在我们的类中覆盖它时调用方法 finalize() 。如前所述,我们必须请求 gc(garbage collector),为此,我们必须在关闭子块的大括号之前编写以下 3 个步骤。

  1. 将引用设置为 null(即 X = Y = null;)
  2. 调用,System.gc();
  3. 调用,System.runFinalization();

现在计算员工人数的正确代码(不包括实习生)


// 计算不包括实习生的员工人数的正确代码
class Employee
{
	private int ID;
	private String name;
	private int age;
	private static int nextId=1;
	//它是静态的,因为它在所有对象之间保持通用并由所有对象共享
	public Employee(String name,int age)
	{
		this.name = name;
		this.age = age;
		this.ID = nextId++;
	}
	public void show()
	{
		System.out.println
		("Id="+ID+"\nName="+name+"\nAge="+age);
	}
	public void showNextId()
	{
		System.out.println
		("Next employee id will be="+nextId);
	}
	protected void finalize()
	{
		--nextId;
		//在这种情况下,gc 会为 2 个对象调用 finalize() 两次。
	}
}

// 它是 Employee 类的右括号
class UseEmployee
{
	public static void main(String []args)
	{
		Employee E=new Employee("GFG1",33);
		Employee F=new Employee("GFG2",45);
		Employee G=new Employee("GFG3",25);
		E.show();
		F.show();
		G.show();
		E.showNextId();
		F.showNextId();
		G.showNextId();
			
		{
			//这是保留所有实习生的子块。
			Employee X=new Employee("GFG4",23);	
			Employee Y=new Employee("GFG5",21);
			X.show();
			Y.show();
			X.showNextId();
			Y.showNextId();
			X = Y = null;
			System.gc();
			System.runFinalization();
		}
	E.showNextId();
	}
}

输出:

 

总结

到此这篇关于Java中垃圾回收机制的文章就介绍到这了,更多相关Java垃圾回收机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文带你回顾Java中的垃圾回收机制

本文链接: https://www.lsjlt.com/news/131906.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文带你回顾Java中的垃圾回收机制
    目录介绍重要条款:使对象符合 GC 条件的方法请求JVM运行垃圾收集器的方式定稿让我们举一个真实的例子,在那里我们使用垃圾收集器的概念。 现在获得正确的输出: 总结介绍 在 C/C+...
    99+
    2024-04-02
  • 一文带你了解JavaScript垃圾回收机制
    目录1. 概述 2. 内存管理 3. 垃圾回收 4. GC算法介绍 5. 引用计数算法 1. 引用计数优缺点 6. 标记清除算法 1. 标记清除算法优缺点 7. 标记整理算法 8. ...
    99+
    2024-04-02
  • 带你一文读懂Python垃圾回收机制
    目录1 引用计数1.1 引用计数算法原理1.2 计数器增减条件1.2.1 引用计数+1的条件1.2.2 引用计数-1的条件1.2.3 代码实战1.3 引用计数的优点与缺点1.3.1 ...
    99+
    2023-05-15
    Python垃圾 Python垃圾回收 垃圾回收机制
  • 一篇带你入门Java垃圾回收器
    目录1 垃圾回收算法1-1 标记清除算法算法概述算法思想1-2 标记整理算法1-3 复制算法2 JVM分代回收算法2-1 概述2-2 分代垃圾回收示例2-3 分代垃圾回收的总结对象首...
    99+
    2024-04-02
  • 垃圾回收机制
      我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是...
    99+
    2023-01-30
    机制 垃圾
  • 浅谈Java垃圾回收机制
    目录一.什么是垃圾二.怎么回收垃圾2.1 静态对象什么时候变成垃圾被回收2.2 新生代和年老代三、垃圾回收算法3.1 标记清除算法3.2 复制清除算法(专门用于处理年轻代垃圾的)3....
    99+
    2024-04-02
  • python垃圾回收机制!
    python的三种垃圾回收机制:1.python采用的是引用计数机制为主;2.标记-清除;为辅的策略3.分代收集(隔代回收、分代回收)为辅的策略 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内...
    99+
    2023-01-31
    机制 垃圾 python
  • Java 中的垃圾回收机制详解
    目录介绍重要条款:使对象符合 GC 条件的方法请求JVM运行垃圾收集器的方式定稿总结介绍 在 C/C++ 中,程序员负责对象的创建和销毁。通常程序员会忽略无用对象的销毁。由...
    99+
    2024-04-02
  • java 垃圾回收机制以及经典垃圾回收器详解
    判断对象存活方法 引用计数法:在对象中添加一个引用计数子,每当一个地方引用他时,计数器就加一,当引用失效时,计数器就减一。 会有对象循环引用问题: objA.instance =...
    99+
    2024-04-02
  • 一篇文章带你了解JVM垃圾回收
    目录1.堆空间的基本结构:2.空间分配担保机制3.如何判断一个对象已经无效4 不可达的对象并非“非死不可”5 如何判断一个常量是废弃常量?6 如何判断一个类是无用的类7.垃圾回收算法...
    99+
    2024-04-02
  • JavaScript中的垃圾回收机制
    聚沙成塔·每天进步一点点 ⭐ 专栏简介⭐ JavaScript的垃圾回收机制⭐ 内存管理⭐ 引用计数⭐ 标记-清除算法⭐ 内存泄漏⭐ 性能优化⭐ 使用`delete`操作符⭐ 注意循环中的变量...
    99+
    2023-10-05
    javascript 开发语言 ecmascript
  • day09(垃圾回收机制)
    1,复习 文件处理 1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...
    99+
    2023-01-31
    机制 垃圾
  • GC垃圾回收机制
    GC垃圾回收机制 一、 GC原理:1、为什么进行垃圾回收 二、JVM与回收算法:1、内存分配2、回收算法1、标记-清除(Mark-sweep)2、复制(Copying)3、标记-整理(Ma...
    99+
    2023-09-24
    jvm java 算法
  • Java的垃圾回收机制详解
    目录 1、C语言与Java语言垃圾回收区别 2、System.gc() 3、面试题引入Java垃圾回收 3.1 jvm怎么确定哪些对象应该进行回收 3.1.1 引用计数法 3.1.2 可达性分析算法  3.2 jvm会在什么时候进行垃圾回收...
    99+
    2023-09-13
    java jvm 开发语言
  • java中的垃圾回收机制以及经典垃圾回收器的详细介绍
    本篇内容介绍了“java中的垃圾回收机制以及经典垃圾回收器的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!判断对象存活方法引用计数法...
    99+
    2023-06-20
  • Java垃圾回收机制是什么
    这篇文章主要介绍“Java垃圾回收机制是什么”,在日常操作中,相信很多人在Java垃圾回收机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java垃圾回收机制是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • JVM的垃圾回收机制你了解吗
    目录一:回收堆内存1.如何判定对象已死(可达性分析算法)2.对象的引用级别 3.对象的死亡过程二:垃圾回收算法1.标记清除算法2.标记复制算法3.标记整理算法三:垃圾收集器...
    99+
    2024-04-02
  • PHP垃圾回收机制的一些理解
    目录垃圾回收是什么东西? PHP 的垃圾回收算法 垃圾回收对性能的影响 总结 相信只要入门学习过一点开发的同学都知道,不管任何编程语言,一个变量都会保存在内存中。其实,我们这些开发者...
    99+
    2024-04-02
  • PHP垃圾回收机制讲解
    PHP的垃圾回收机制 垃圾回收机制是一种动态存储分配的方案。它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑...
    99+
    2024-04-02
  • 简单介绍Java垃圾回收机制
    Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。这篇教程是系列第一部分。首先会解释基本的术语...
    99+
    2023-05-30
    java 垃圾回收机制 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作