公共空间设计网站,分类网站一天做几条合适,元宇宙app技术开发,互联网免费下载垃圾回收算法以及垃圾回收器以下是我们的垃圾收集手册中的一个示例#xff0c;该手册将在接下来的几周内发布。 同时#xff0c;花点时间熟悉垃圾收集的基础知识-这将是本书的第一章。 乍一看#xff0c;垃圾收集应该处理顾名思义的问题–查找并丢弃垃圾。 实际上#xff… 垃圾回收算法以及垃圾回收器 以下是我们的垃圾收集手册中的一个示例该手册将在接下来的几周内发布。 同时花点时间熟悉垃圾收集的基础知识-这将是本书的第一章。 乍一看垃圾收集应该处理顾名思义的问题–查找并丢弃垃圾。 实际上它所做的恰恰相反。 垃圾收集正在跟踪所有仍在使用的对象并将其余对象标记为垃圾。 牢记这一点我们开始深入研究如何为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_ptrvectorint elements make_shared(new vectorint());if(read_elements(n, elements) n) {return -1;}return 0;
} 我们正在使用的shared_ptr会跟踪对其的引用数。 此数字随着您的传递而增加随着其离开范围而减小。 一旦引用数量达到零 shared_ptr就会自动删除基础向量。 自动内存管理 在上面的C 代码中我们仍然必须明确地说出何时需要进行内存管理。 但是如果我们可以使所有对象以这种方式表现呢 这将非常方便因为开发人员可能不再需要考虑自己清理。 运行时将自动了解不再使用某些内存并将其释放。 换句话说它会自动收集垃圾 。 1959年第一个垃圾收集器出现在Lisp那里从那时起这项技术才发展起来。 参考计数 我们用C 的共享指针演示的想法可以应用于所有对象。 许多语言例如PerlPython或PHP都采用这种方法。 最好用图片来说明 绿云表示程序员指向的对象仍在使用中。 从技术上讲这些可能是诸如当前正在执行的方法中的局部变量或静态变量之类的东西。 它可能因编程语言而异因此在此我们将不再关注。 蓝色圆圈是内存中的对象您可以看到对其的引用数量。 最后灰色圆圈是未从任何范围引用的对象。 因此灰色物体是垃圾可以由垃圾收集器清理。 这一切看起来真的很好不是吗 可以但是整个方法都有很大的缺点。 结束对象的分离循环是很容易的这些对象都不在范围内但是由于循环引用其引用的计数不为零。 这是一个例子 看到 红色对象实际上是应用程序不使用的垃圾。 但是由于引用计数的限制仍然存在内存泄漏。 有一些方法可以克服此问题例如使用特殊的“弱”引用或应用单独的算法来收集周期。 提到的语言PerlPython和PHP都以一种或另一种方式处理循环但这超出了本手册的范围。 相反我们将开始更详细地研究JVM所采用的方法。 扫一扫 首先JVM更具体地说明了对象的可访问性。 与其在前几章中看到的模糊定义的绿色云不如我们有一组非常具体和明确的对象称为“ 垃圾收集根” 局部变量 活动线程 静态场 JNI参考 其他稍后将讨论 JVM用于跟踪所有可到达活动对象并确保可重用非可访问对象声明的内存的方法称为标记和清除算法。 它包括两个步骤 标记正在遍历所有可到达的对象并将有关所有此类对象的分类帐保存在本机内存中 扫描确保了不可访问对象占用的内存地址可以在下一次分配中重用。 JVM中的不同GC算法例如Parallel ScavengeParallel Mark Copy或CMS在实现这些阶段时略有不同但是从概念上讲该过程仍然类似于上述两个步骤。 关于此方法至关重要的一点是周期不再泄漏 不太好的事情是需要停止应用程序线程以进行收集因为如果引用线程一直在变化那么您就无法真正计数它们。 当应用程序暂时停止以使JVM可以沉迷于家政活动时这种情况称为Stop The World暂停 。 它们的发生可能有多种原因但是垃圾收集是迄今为止最受欢迎的一种。 如果您能够通过发布获得成功那么我仅建议您订阅我们的Twitter feed 在其中继续发布与Java性能相关的其他主题。 翻译自: https://www.javacodegeeks.com/2015/05/what-is-garbage-collection.html垃圾回收算法以及垃圾回收器