什么是垃圾回收?

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

乍一看,垃圾收集应该处理顾名思义的问题-查找并丢弃垃圾。 实际上,它所做的恰恰相反。 垃圾收集正在跟踪所有仍在使用的对象,并将其余对象标记为垃圾。 牢记这一点,我们开始深入研究如何为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, …

Extjs tree树的生成

前端代码&#xff1a;先后顺序引入extjs-base.js 和extjs-all.js function initTree(){ var Tree Ext.tree; tree new Tree.TreePanel({ id : treeid,//自定义treeid el : tree_id,//div标签id split : false, monitorResize :true, …

在标记的HREF属性中javascript:alert(this.innerHTML)会怎么样?

在标记的HREF属性中javascript:alert(this.innerHTML)会怎么样? 原文:在标记的HREF属性中javascript:alert(this.innerHTML)会怎么样? <a href"javascript:alert(this.innerHTML)" mce_href"javascript:alert(this.innerHTML)">标签</a> 上面…

Getter DI是个好主意吗?

有时&#xff0c;您可能会听说通过getter方法完成的依赖项注入&#xff0c;该方法会覆盖子类或伪造测试框架。 它允许类具有一组设置的依赖关系&#xff0c;该依赖关系实际上是经过硬编码的&#xff0c;但是可以根据需要“注入”。 从现在开始&#xff0c; 我已经写过关于所谓…

java数组根据下标插入数据

/** * * param arr1 源数组 * param n 下标 0...n * param value 值 * return */ public static String[] insertArray(String[] arr1,int n, String value){ //复制一个长度1的数组 String[] arr2 Arrays.copyO…

Javascript - 栈 和 单链表

最近在重温数据结构&#xff0c;于是写了一些代码玩玩&#xff0c;都是很初级的&#xff0c;表喷各位。。。。 function Stack() {this.dataStore [];this.top 0; }Stack.prototype {length: function () {return this.top;}, push: function (element) {this.dataStore[thi…

linux在文件或文件夹中查找字符串

命令&#xff1a;grep "字符串“ * -Rn 注&#xff1a;注意命令大小写&#xff0c;在当前文件夹下的所有文件中搜索字符串 命令&#xff1a;grep -rn ‘字符串’ xxx.log 注&#xff1a; 查询出字符串位置,xxx.log 为被搜索的文件 命令&#xff1a;more 1200 xxx.log 注…

sqlite数据库检索

1. 数据库检索&#xff0c; 得到某字段下所有值 1 - (NSArray *)selectWithColumName: (NSString *)columName2 tableName: (NSString *)tableName {3 if ([self openDatabase] YES) {4 5 NSString * selectSQL [NSString string…

处理中断

我只是在观看Heinz Kabutz的VJUG采访 &#xff0c;这启发了我写一篇有关中断的文章。 顺便说一句&#xff0c;我建议您订阅VJUG YouTube频道 -确实非常有用。 Heinz始终是物有所值的&#xff0c;并且很难学到很多东西就很难看他的演讲。 他提出了有关如何处理InterruptedExcep…

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

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

从拟物到简约 ------谈网站设计风格的变革

哪种设计才是好的设计&#xff1f;其实&#xff0c;每种设计都有其优势也会有其不足。关键在其应用场合&#xff0c;以及是否能够向用户传递有效的价值。武断地决定是否采用某种技术或者不思考其能否取悦用户的设计不是好设计。好的设计不应当局限于某种设计风格&#xff0c;而…

java遍历文件夹并获取所有路径

/** * 获取路径下的所有文件/文件夹 * param directoryPath 需要遍历的文件夹路径 * return */ public static List<String> getAllFile(String directoryPath) { LinkedList list new LinkedList(); if(directoryPathnull){ …

java中文件处理之图片_在Java 7中处理文件

java中文件处理之图片以下是The Well-Grounded Java Developer的草稿的修改后的片段。 它使您快速了解与以前版本相比&#xff0c;在Java 7中操作文件要容易得多。 通过使用新的Files类及其许多实用程序方法&#xff0c;您可以仅用一行代码就可以对文件执行以下操作&#xff1a…

java实时记录在线人数

1.配置过滤器 <listener> <listener-class>com.listener.SessionCount</listener-class > </listener> 2.登陆时记录 package com.insigma.common.listener; import java.util.HashMap; import java.util.HashSet; import java.util.Map.Entr…

检讨程序猿

程序员变程序猿&#xff0c;这是个中国问题。多年前&#xff0c;浦东某开发区一个年轻的编程员因病去世&#xff0c;他母亲从四川赴沪奔丧&#xff0c;清理遗物时&#xff0c;她发现儿子床垫下都是钱&#xff0c;老人家痛哭失声&#xff0c;她说&#xff0c;你们看呐&#xff0…

在Java 8中使用Rhino

Java将Nashorn作为JSR 223的新JavaScript实现&#xff08;javax.scripting&#xff09;。 尽管这无疑是个好消息&#xff08;通过直接生成Java代码&#xff0c;Nashorn比Rhino快得多&#xff09;&#xff0c;但它也带来了一些挑战&#xff1a; Nashorn与Rhino并非100&#xff…

java复制单个文件

/*org.apache.commons.io.FileUtils:java文件工具类*/ String targetPath"/xxx/targetfile.pdf";//已知文件全路径 String sourcePath/xxx/sourcefile.pdf";//复制文件全路径 File fnew File(targetPath); try { if(!f.exists()) { …

FTP服务器的搭建与安全配置

FTP可以说是Internet上使用非常广泛的一种通讯协议了。它工作在OSI模型的第7层&#xff0c;是TCP/IP的一种具体应用。FTP采用基于TCP的可靠连接&#xff1a;监听21端口来等待控制连接请求&#xff0c;当连接建立后&#xff0c;采用20号端口来建立数据传输通道。 FTP中使用的一些…

C#值类型以及默认值记录下

C#的值类型有bool,byte,sbyte,decimal,double,float,int,uint,long,string等 如果我们擅长使用默认值&#xff0c;可以帮助我们减少带来赋值及代码编写. 比如我我经常赋值&#xff1a; int i0;下面都是各个值类型的默认值&#xff1a; bool>false byte,sbyte>0 int,uint,…

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

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