什么是垃圾回收?

以下是我们的垃圾收集手册中的一个示例,该手册将在接下来的几周内发布。 同时,花点时间熟悉垃圾收集的基础知识-这将是本书的第一章。

乍一看,垃圾收集应该处理顾名思义的问题-查找并丢弃垃圾。 实际上,它所做的恰恰相反。 垃圾收集正在跟踪所有仍在使用的对象,并将其余对象标记为垃圾。 牢记这一点,我们开始深入研究如何为Java虚拟机实现称为“垃圾回收”的自动内存回收过程。

手动内存管理

在我们开始以现代形式介绍Garbage Collection之前,让我们快速回顾一下您不得不手动和显式分配和释放数据存储空间的日子。 而且,如果您忘记释放它,则将无法重用该内存。 该内存将被声明但未被使用。 这种情况称为内存泄漏

这是一个使用C语言编写的,使用手动内存管理的简单示例:

int send_request() {size_t n = read_size();int *elements = malloc(n * sizeof(int));if(read_elements(n, elements) < n) {// elements not freed!return -1;}// …free(elements)return 0;
}

如我们所见,忘记释放内存是很容易的。 内存泄漏曾经是比现在更常见的问题。 您只能通过修复代码来真正打败他们。 因此,更好的方法将是自动回收未使用的内存,从而完全消除人为错误的可能性。 这种自动化称为垃圾收集 (或简称GC)。

智能指针

自动进行垃圾收集的第一种方法是基于引用计数。 对于每个对象,您只需知道它被引用了多少次,并且当计数达到零时,就可以安全地回收该对象。 一个著名的例子就是C ++的共享指针:

int send_request() {size_t n = read_size();stared_ptr<vector<int>> elements = make_shared(new vector<int>());if(read_elements(n, elements) < n) {return -1;}return 0;
}

我们正在使用的shared_ptr会跟踪对其的引用数。 此数字随着您的传递而增加,而随着其离开范围而减小。 一旦引用数达到零, shared_ptr就会自动删除基础向量。

自动内存管理

在上面的C ++代码中,我们仍然必须明确地说出何时需要进行内存管理。 但是,如果我们可以使所有对象以这种方式表现呢? 这将非常方便,因为开发人员可能不再需要考虑自己清理。 运行时将自动了解不再使用某些内存,并将其释放。 换句话说,它会自动收集垃圾 。 1959年,第一个垃圾收集器出现在Lisp那里,从那时起,这项技术才发展起来。

参考计数

我们用C ++的共享指针演示的想法可以应用于所有对象。 许多语言(例如Perl,Python或PHP)都采用这种方法。 最好用图片说明:

Java GC计数参考1

绿云表示程序员指向的对象仍在使用中。 从技术上讲,这些可能是诸如当前执行的方法中的局部变量或静态变量之类的东西。 它可能因编程语言而异,因此在此我们将不再关注。

蓝色圆圈是内存中的对象,您可以看到对其的引用数量。 最后,灰色圆圈是未从任何范围引用的对象。 因此,灰色物体是垃圾,可以由垃圾收集器清理。

这一切看起来真的很好,不是吗? 可以,但是整个方法都有很大的缺点。 结束对象的分离循环是很容易的,这些对象都不在范围内,但是由于循环引用,其引用的计数不为零。 这是一个例子:

Java GC标记和扫描

看到? 红色对象实际上是应用程序不使用的垃圾。 但是由于引用计数的限制,仍然存在内存泄漏。

有一些方法可以解决此问题,例如使用特殊的“弱”引用或应用单独的算法来收集周期。 提到的语言(Perl,Python和PHP)都以一种或另一种方式处理循环,但这超出了本手册的范围。 相反,我们将开始更详细地研究JVM所采用的方法。

扫一扫

首先,JVM更具体地说明了对象的可访问性。 与其在前几章中看到的模糊定义的绿色云,不如我们有一组非常具体和明确的对象,称为“ 垃圾收集根”

  • 局部变量
  • 活动线程
  • 静态场
  • JNI参考
  • 其他(稍后将讨论)

JVM用于跟踪所有可到达(活动)对象并确保非可到达对象声明的内存可重复使用的方法称为标记和清除算法。 它包括两个步骤:

  • 标记正在遍历所有可到达的对象,并在所有这些对象的本机内存中保留分类帐
  • 扫描确保了不可访问对象占用的内存地址可以在下一次分配中重用。

JVM中不同的GC算法,例如Parallel Scavenge,Parallel Mark + Copy或CMS,在实现这些阶段时略有不同,但是从概念上讲,该过程仍然类似于上述两个步骤。

关于此方法,至关重要的一点是周期不再泄漏:

Java GC计数参考1

不好的是,需要停止应用程序线程才能进行收集,因为如果引用一直在变化,那么您就无法真正计数引用。 当应用程序暂时停止以使JVM可以沉迷于家政活动时,这种情况称为Stop The World暂停 。 它们的发生可能有多种原因,但是垃圾收集是迄今为止最受欢迎的一种。

如果您能够通过发布获得成功,那么我只能建议订阅我们的Twitter feed ,在其中继续发布与Java性能相关的其他主题。

翻译自: https://www.javacodegeeks.com/2015/05/what-is-garbage-collection.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Extjs弹窗-简单文本编辑框-Ext.Msg.show

var datavalue测试202109;//文本传入数据 Ext.Msg.show({ title:标题, msg:说明, width:600, height:500, prompt:true, multiline:200, closable:true, …

word模板插入文本域并调整表格某一个行的列宽度

一、插入文本域 操作步骤&#xff1a;插入&#xff08;菜单&#xff09;->文档部件&#xff08;菜单&#xff09;->域&#xff08;菜单&#xff09;->邮件合并->输入名称->确认 二、调整word表格某个单元格宽度 选中某行&#xff0c;按住ctrl键的同时&#xf…

java泛型视频教程_Java泛型快速教程

java泛型视频教程泛型是Java SE 5.0引入的一种Java功能&#xff0c;在其发布几年后&#xff0c;我发誓那里的每个Java程序员不仅会听说过&#xff0c;而且已经使用过。 关于Java泛型&#xff0c;有很多免费和商业资源&#xff0c;而我使用的最佳资源是&#xff1a; Java教程 …

Windows上的Oracle Java

我最近为基于Windows 7的笔记本电脑下载了JDK 9的早期访问版本 &#xff08;内部版本68 &#xff09;。 由于这是早期版本&#xff0c;因此当自动安装在笔记本电脑上安装主要Java Runtime Environment&#xff08;JRE&#xff09;引入了一些不太理想的问题时&#xff0c;我并不…

extjs弹出窗口查看文本内容-new Ext.Window

代码样例&#xff1a; function processscan(){ var text时间 用户 操作<br> 时间 用户 操作<br> 时间 用户 操作; var win new Ext.Window({ layout: fit, width: 700, height: 600, closeAction: hide, dra…

Ioc Autofac心得

对于这个容器注入&#xff0c;个人也不是很熟悉&#xff0c;很多还不懂&#xff0c;只会基本的操作&#xff0c;几天把它记录下来&#xff0c;说不定以后帮助就大了呢&#xff0c;这方面跟安卓差距还是挺大的 下面记录下应用的流程 步骤&#xff1a; 1.添加应用 2.重写工厂&…

深入学习Web Service系列----异步开发模式

概述 在本篇随笔中&#xff0c;通过一些简单的示例来说一下Web Service中的异步调用模式。调用Web Service方法有两种方式&#xff0c;同步调用和异步调用。同步调用是程序继续执行前等候调用的完成&#xff0c;而异步调用在后台继续时&#xff0c;程序也继续执行&#xff0c;不…

navicate导出导入表数据问题

1.导出导入json&#xff0c;如下图&#xff0c;右击表点击导出向导&#xff0c;选择json导出类型&#xff0c;根据提示导出即可。 导入时&#xff0c;右击接收的表&#xff0c;点击导入向导&#xff0c;根据提示即可快速导入&#xff08;注&#xff1a;不同系统之间导出导入易…

tongweb通过控制台简单设置确认相关常用参数

1.环境版本 jdk&#xff0c;tongweb版本确认是否正确 2.检查tongweb的 license是不是永久版本&#xff0c;试用期版本到期会停止服务。 3 JVM运行编码配置-根据系统需要配置 3.1-Dfile.encodingUTF-8 编码根据系统需要配置 4. tongweb运行内存大小--根据系统需要配置 4.1一般 …

编译原理--LL(1)分析法实验C++

一、实验项目要求 1.实验目的 根据某一文法编制调试LL&#xff08;1&#xff09;分析程序&#xff0c;以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL&#xff08;1&#xff09;分析法的理解。 2.实验要求 对下列文法&#xff0c;用LL&#xff08;…

实际中进行GC调整

调优垃圾回收与任何其他性能调优活动没有什么不同。 您需要确保了解当前的情况和期望的结果&#xff0c;而不是因为对应用程序的随机部分进行调整而产生了诱惑。 通常&#xff0c;只需执行以下过程即可&#xff1a; 陈述您的绩效目标 运行测试 测量 与目标比较 进行更改并…

达梦数据库出现卡慢简单分析点

1.检查是否有锁表 查询锁表&#xff1a;select sess_id,sql_text from v$sessions sess,v$lock lck where sess.trx_idlck.trx_id and lck.blocked1; --查询僵死会话 解锁&#xff1a;根据会话ID&#xff0c;停止会话 sp_close_session(sess_id); 2.根据v$sessions,V$L…

SEL selector (二)

SEL消息机制工作原理是什么 引用下面文章&#xff1a; 我们在之前有提到,一个类就像一个 C 结构.NSObject 声明了一个成员变量: isa. 由于 NSObject 是所有类的根类,所以所有的对象都会有一个 isa 的成员变量[公共继承].而该 isa 变量指向该对象的类(图3.15)[类在Objective-C中…

mobile cpu上禁用alpha test的相关总结

因为&#xff0c;每家芯片的特性不同&#xff0c;根据向framebuffer写法的不同&#xff0c;分为tile-based的mobile cpu&#xff0c;如ImgTec PowerVR&#xff0c;ARM Mali&#xff0c;一部分老版本Qualcomm Adreno。还有标准的direct&#xff08;immediate&#xff09;的mobil…

达梦定时迁移数据

1. 生成迁移源代码 1.1 启动DM迁移工具&#xff08;bin/dts.exe&#xff09; 1.2 右击迁移管理空白处 -> 新建工程 1.3 展开工程 -> 右击迁移&#xff0c;新建迁移 -> 输入迁移名称&#xff0c;确认 1.4 右击迁移名称&#xff0c;打开 -> 输入源数据库连接信息&…

JSP教程–最终指南

编者注&#xff1a; JavaServer Pages&#xff08;JSP&#xff09;技术使您可以轻松创建同时包含静态和动态组件的Web内容。 JSP技术提供了Java Servlet技术的所有动态功能&#xff0c;但提供了一种更自然的方法来创建静态内容。 JSP技术的主要功能包括用于开发JSP页面的语言&…

tongweb6数据源使用中时常报空异常处理方式

1.在tongweb控制台 -> jdbc配置中设置数据源参数 1.1 勾选空闲超时&#xff0c;时间默认 1.2 勾选泄露超时时间 &#xff0c;时间为半天&#xff08;14400&#xff09; 1.3 勾选连接有效性检查、创建连接验证、获取连接验证、归还连接验证 图中设置泄露超时时间为900…

eclipse远程tomcat javaweb debug样例(windows)

1.tomcat配置可被远程debug端口参数 catalina.bat 中添加 set CATALINA_OPTS-Xdebug -agentlib:jdwptransportdt_socket,servery,suspendn,address8000 导出项目war包到tomcat/webapps/目录下 切换到tomcat/bin目录下 双击startup.bat启动运行项目 2.eclipse中启动远程debug…

ASP.NET MVC的ContentResult

ASP.NET MVC的ContentResult返回简单的纯文本内容&#xff0c;可通过ContentType属性指定应答文档类型&#xff0c;通过ContentEncoding属性指定应答文档的字符编码。一个例子来演习&#xff0c;自定义一个RwResult&#xff0c;它继承ContentResult&#xff0c;为视图象ASP.NET…

windows搜索指定目录下包含某个字符串的文件

1.打开cmd窗口 &#xff1a;winr 快捷键-> 输入cmd 回车 2.切换到被搜索的文件夹&#xff08;E:\shgwy文档\日常\更新\20220808&#xff09;下 如输入&#xff1a; cd E:\shgwy文档\日常\更新\20220808 e: 3.输入搜索命令 c:\Windows\System32\findstr.exe /s /i "wa…