搜索
首页web前端js教程浅析堆与垃圾回收机制
浅析堆与垃圾回收机制Jul 03, 2020 am 09:20 AM
垃圾回收机制

这篇文章我们主要关注这些问题::Java程序执行完后,堆中的对象什么时候被回收?如何回收?

堆又叫做 “GC堆,"由于现在收集器基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代,比例是1:2;再细致一点新生代内部又划分为Eden区、Survivor区,比例为8:1。下图显示了堆的结构:

对象在堆中内存的分配是有严格规定的,策略为:

  • 对象优先在新生代Eden区分配内存;

  • 大对象直接进老年代,主要是长字符串和数组这些需要大量连续内存空间的对象;

  • 长期存活的对象进入老年代。Eden区内存不够时,JVM发起一次MinorGC,对象的年龄加一,默认对象年龄到15时进入老年代;

  • 动态年龄判定。相同年龄所有对象大小的总和大于 Survivor 空间的一半,大于等于该年龄的对象进入老年代

新生代 GC指Minor GC,在新生代的进行垃圾回收,频繁且快。 老年代 GC(Major GC/Full GC)在老年代进行垃圾回收,通常伴随着至少一次的minor gc。速度慢。Full GC在如下几种情况下都会被触发:

  1. 老年代空间不足;

  2. 方法区空间不足;

  3. 调用System.gc(),建议JVM进行full gc;

  4. 长期存活的对象转入老年代,空间不足;

  5. 没有足够的连续空间分配给大对象;

  6. 新生代垃圾回收存活的对象太多,S1放不下,老年代担保空间不足,担保空间指的是老年代最大可用的连续空间是否大于新生代所有对象总空间。

  堆里面几乎放了所有的对象,那我们怎么知道这些对象是否还有用呢?JVM提供了两种方法来判定:

  • 引用计数法:给对象添加一个引用计数器,每次被引用,计数器值加一,引用失效,计数器值减一,当引用数为0时,表示对象不存活。引用计数法无法解决循环引用问题,周志朋老师书里面有详细的例子,也是比较容易理解的。

  • 可达性分析法:以 ”GC Roots“对象为起始点,就像是树的根节点,向下搜索,搜索走过的路径称为引用链,如果一个对象到 GC Roots起始点没有引用链,则此对象不可达,是需要被回收的。GC Roots是指虚拟机栈引用的对象,本地方法栈引用的对象,方法区静态属性引用的对象,方法区常量引用的对象。

上面提到了引用,对象的存活都和引用有关,引用类型又分为强引用,软引用,弱引用,虚引用。

  • 强引用,new出来的对象,垃圾回收器绝不会回收它;

  • 软引用,在系统将要发生OMM前会回收这些对象的内存;

  • 弱引用,垃圾收集器工作时只要发现,马上回收;

  • 虚引用,形同虚设,任何时候都可能被回收。

实际上可达性分析法判定的不可达对象不会马上回收,对象真正被回收需要经过两次标记。第一次标记就是被判定为不可达对象,然后进行一次筛选,筛选条件是此对象是否有必要执行finalize()方法。如果没有重写finalize()方法或者finalize()方法已经被虚拟机调用过,finalize()方法只会被系统调用一次。这两种情况都是”没有必要执行的“。如果有必要,这个对象会被放在F-Quene队列中,由虚拟机自动建立的低优先级的Finalizer线程去执行finalize()方法。这期间GC会对F-Quene中的对象进行第二次小规模标记,如果对象依然没有被引用,那就会被回收,没有被筛选的对象不一定被回收。

我们已经知道对象什么时候被回收了,那如何回收呢?介绍四种最常用的垃圾回收算法:

  • 标记-清除:先标记需清除的对象,统一回收----效率不高,会产生大量不连续的碎片;

  • 复制算法:将内存分块,每次只使用一块,使用完后,将存活的对象复制到另一块上;

  • 标记整理:先标记存活对象,然后让所有存活对象向一端移动,直接清理端边界以外的内存;

  • 分代算法,堆分队新生代和老年代,新生代每次收集都会有大量的对象死去,选择复制算法。老年代存活率比较高,且没有额外空间进行分配担保,选择标记清除或者标记整理算法。

垃圾收集算法是一种内存回收的思想,具体的实现是垃圾收集器。简要介绍下常用的垃圾收集器:

  • serial串行收集器。单线程,垃圾回收的时候,必须暂停其他工作。新生复制,老年标记整理。简单高效;

  • ParNew 收集器。serial的多线程版本;

  • Parallel Scavenge 收集器,复制算法的多线程收集器。注重吞吐量,cpu运行代码时间/cpu耗时总时间。新生复制,老年标记整理;

  • Serial Old 收集器,老年代版本;

  • Parallel Old 收集器,Parallel Scavenge老年代版本;

  • CMS 收集器,注重最短时间停顿。并发收集器,垃圾收集线程与用户线程(基本上)同时工作。 标记清除算法

关于垃圾收集器更多的细节可以阅读周志朋老师的书。

推荐教程:《JS教程

以上是浅析堆与垃圾回收机制的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:博客园。如有侵权,请联系admin@php.cn删除
一文聊聊php中的垃圾回收机制一文聊聊php中的垃圾回收机制Aug 26, 2022 am 10:48 AM

本篇文章带大家深入了解一下php中的垃圾回收机制,希望对大家有所帮助!

解密Go语言的内存管理和垃圾回收机制解密Go语言的内存管理和垃圾回收机制Nov 30, 2023 am 09:17 AM

Go语言是一门高效、安全、并发的编程语言,其中内存管理和垃圾回收机制的设计也是其独特之处。本文将深入解密Go语言的内存管理和垃圾回收机制。一、内存管理在Go语言中,内存管理包括内存分配和内存释放两个方面。1.1内存分配在Go语言中,我们通过内置函数new和make来进行内存分配。其中,new返回一个指向新分配的零值的指针,而make则返回一个指定类型及其长

Java 函数中内存释放的常见问题是如何解决的?Java 函数中内存释放的常见问题是如何解决的?May 02, 2024 am 09:57 AM

Java中内存管理涉及垃圾收集,但仍可能出现问题。常见问题包括内存泄漏和内存碎片。内存泄漏是由于对象持有不再需要的引用,可用通过避免循环引用、使用弱引用和限定变量范围来解决。内存碎片是由于频繁分配和释放导致,可用通过使用内存池、大对象池和压缩垃圾收集来解决。例如,使用弱引用可以处理内存泄漏问题,确保垃圾收集器在不再需要时回收对象。

深入理解PHP底层开发原理:内存管理和垃圾回收机制深入理解PHP底层开发原理:内存管理和垃圾回收机制Sep 10, 2023 pm 02:30 PM

深入理解PHP底层开发原理:内存管理和垃圾回收机制引言:PHP作为一种高级编程语言,广泛应用于Web开发。许多开发者对PHP的语法和特性都比较熟悉,但对于PHP底层开发原理的理解可能相对较少。本文将深入探讨PHP底层开发原理中的内存管理和垃圾回收机制,帮助读者更好地理解PHP的运行机制。一、PHP的内存管理内存分配与释放PHP中的内存管理是由Zend引擎负责

深入解析Python中的垃圾回收机制深入解析Python中的垃圾回收机制Mar 29, 2018 pm 01:20 PM

得益于Python的自动垃圾回收机制,在Python中创建对象时无须手动释放。这对开发者非常友好,让开发者无须关注低层内存管理。但如果对其垃圾回收机制不了解,很多时候写出的Python代码会非常低效。

探索Go语言的内存管理特点和垃圾回收机制探索Go语言的内存管理特点和垃圾回收机制Jan 23, 2024 am 10:07 AM

探索Go语言的垃圾回收机制与内存管理特点引言:随着互联网的发展,开发者们对于编程语言的要求也越来越高。Go语言作为一种静态类型、编译型语言,自诞生之初就凭借其高效的垃圾回收机制和内存管理特点备受关注。本文旨在深入探索Go语言的垃圾回收机制以及其内存管理的特点,通过具体的代码示例帮助读者更好地理解和利用这些特性。一、垃圾回收机制1.1标记-扫描算法Go语言的

探究:JVM垃圾回收机制的不同发展阶段探究:JVM垃圾回收机制的不同发展阶段Feb 23, 2024 pm 05:36 PM

深度剖析:JVM垃圾回收机制的多样化演变,需要具体代码示例一、引言随着计算机科学的发展,垃圾回收机制在JVM(Java虚拟机)中扮演着至关重要的角色。JVM垃圾回收机制的多样化演变是为了改善Java程序的性能和内存管理。本文将深入剖析JVM垃圾回收机制的具体演变,同时提供具体的代码示例来帮助读者更好地理解。二、垃圾回收机制的基本原理在解释JVM垃圾回收机制的

Golang函数的垃圾回收机制的详解和自定义场景应用Golang函数的垃圾回收机制的详解和自定义场景应用May 16, 2023 am 08:05 AM

Golang作为一种新近兴起的编程语言,在近年来越来越受到开发者们的关注和喜爱。其中Golang的函数垃圾回收机制也是其中的一大亮点,因为它能够在运行时动态地回收不再使用的内存,有效地避免了内存泄漏等问题。本文将详细介绍Golang函数的垃圾回收机制,以及如何在不同场景下自定义应用。一、Golang的垃圾回收机制简介垃圾回收机制是现代编程语言中必不可少的机制

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能