JVM垃圾回收2(垃圾收集算法)

  根据《深入理解java虚拟机》这本书总结

  一、关于几个概念:(标记垃圾算法、垃圾收集算法、垃圾收集器)

  前面说了如何寻找jvm垃圾,有两种方法:引用计数法/可达性算法。这篇准备讲,标记完垃圾之后,回收的算法,这里的算法只是垃圾回收的思想。后面会讲到多种垃圾收集器,这里的垃圾收集器就是运用了垃圾手机算法的思想,可以说是具体实现。

  这里还是想多余的说一下这三个概念:
    垃圾标记算法:标记垃圾的方法

    垃圾收集算法:一种回收思想,供垃圾收集器使用。可能用在年轻代,也可能用在老年代(当然现在来说老年代和年轻代的算法基本是固定的)

    垃圾收集器:垃圾回收算法的实现,真正回收垃圾者。一个垃圾收集器可以用在不同的区域,可以跟不用的垃圾收集器搭配使用,去回收标记了的垃圾。

  二、三种垃圾收集算法

  1、标记-清除:标记垃圾-->直接清除垃圾

    这种算法有两个缺点:1、效率:标记和清除的过程都是很耗时间的。2、空间问题:因为内存分配是一块一块的,直接清除标记的垃圾,没有进行空间整理,会产生很多垃圾碎片,可能所有可用空间较大,但是没有连续的大空间,导致大对象不能存储。

  2、复制算法:复制算法显然需要至少两块区域,垃圾收集的时候将可用对象按顺序复制到一块空区域,原区域直接清除。这样就解决了空间碎片的问题。具体思想如下:

  (1)将内存分为两块相等的区域,分配内存时候只使用一块区域,当该区域满了,需要gc的时候,标记后把该区域可用对象复制到另外一个区域,并且清除。但是这样的做法导致内存利用率不高,只有一半的内存可以在一个时间内使用。

  (2)将内存分为三个区域:较大的Eden区域、两个较小的survivor1和2区域,分配内存的时候,只分配给Eden,当gc的时候,将eden可用对象复制到空闲的survivor1中,清除eden。继续分配内存,分配给eden,当需要再次gc,将eden和survivor1中可用对象复制到survivor2中,如此循环。

  一般来说,现在都用第二种方法,这种方法的空间利用率得到提高,三个空间的占比一半为:8-1-1,利用率在90%。但是这样,因为复制的时候,只能复制给百分之10的区域,所以需要内存中对象垃圾占比较多。所以这种方法,一般来说都用在新生代,这些对象大多数都是创建后就需要回收的,当然,如果真的发生了survivor不够放置的情况,这里有个空间分配担保机制,一般会分配给老年代区域。

  3、标记-整理:标记垃圾--->可用对象整理

    (1)标记-整理算法,比较标记清除算法而言,优化了空间碎片的有点,将可用对象都向前移动。

    (2)相对于复制算法而言,复制算法比较适合对象存活率不高的区域,对于新生代来说比较适合。但是对于老年代,对象存活率很高。这时候用标记整理的算法,会更合适。

  三、关于年轻代和老年代

    一般的内存都会分为年轻代和老年代。什么样的对象会出现在年轻代?什么样的对象会出现在老年代?年轻代的话一般对象都是优先分配给年轻代的。老年代的情况有以下几种:

    1、大对象:jvm可以设定值,如果对象过大,会直接放入老年代,入数组啊什么的。

    2、年轻代转移过来:对象分配给年轻代后会有一个年龄属性,每次gc的时候,如果对象还存活,就会给年龄加1,如果大于默认的15/或者相同的年龄大于内存的一半的时候可以不达到设定年龄,就会转移到老年代。

    可以看出,存活率比较高的对象,一半都会放置在老年代,所以对象上面的算法来说:

    老年代:标记-清除、标记-整理

    年轻代:复制算法

        

    

    

  

时间: 2024-10-12 17:52:03

JVM垃圾回收2(垃圾收集算法)的相关文章

JVM垃圾回收机制与算法

JVM内存由几个部分组成:堆.方法区.栈.程序计数器.本地方法栈 JVM垃圾回收仅针对公共内存区域,即:堆和方法区进行,因为只有这两个区域在运行时才能知道需要创建些对象,其内存分配和回收都是动态的. 一.垃圾回收策略 1.1分代管理 将堆和方法区按照对象不同年龄进行分代: (Young Generation and Old Generation)堆中会频繁创建对象,基于一种分代的思想,按照对象存活时间将堆划分为新生代和旧生代两部分,并不是一次垃圾回收新生代存活的对象就放入旧生代, 而是要经过几次

JVM垃圾回收概念和算法

GC中的垃圾:特指存在于内存中.不会再使用的对象. 内存泄漏和内存溢出的区别: 内存泄漏:内存空间忘记回收,垃圾对象永远无法被回收 内存溢出:垃圾对象(不满足回收条件)所耗内存持续上升,导致内存溢出. 1 常用的垃圾回收算法 引用计数法.标记压缩法.标记清除法.复制算法和分代.分区 1)引用计数法:

JVM垃圾回收算法 总结及汇总

先看一眼JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,

JVM垃圾回收算法(最全)

JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C

JVM中的垃圾回收器及垃圾收集算法描述

首先需要了解下JVM(Java虚拟机)中的内存分配情况: 收集器的介绍: Serial收集器:是最原始的收集器,是单线程的,实现简单,但是在后台收集垃圾的时候,其他的工作线程都会停止,直到垃圾收集线程执行完毕,给用户的体验就是出现停顿现象,体验差.但是当收集的垃圾少,停顿时间短,次数少,还是可以接受的.运行在Client模式下是一个很好的选择.ParNew收集器:是Serial收集器的多线程办,不过在单处理器下效果不比Serial收集器效果好,多线程会采取对应的机制,默认开始的线程数量和CPU的

谈谈JVM垃圾回收机制及垃圾回收算法

一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”.垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存. ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其

JVM垃圾回收算法总结

整理了一下JVM垃圾回收的分代回收算法,旨在能够以后能够快速熟悉这些算法,而不用去查找大量资料(可以认为是偷懒),也是为了分纤箱一下自己的一些理解,有不足或错误之处,希望大家指正,共同进步!1.分代回收算法分代回收算法是标记-复制算法和标记-整理算法(标记-清楚)的集合,朱亚平是对新生代和老年代分别进行处理:在介绍分代回收算法之前首先介绍一下标记-复制算法.标记-清除和标记-整理算法:1)标记-复制算法:将可用内存分为两部分,只用其中的一部分,当这部分内存用完时,会将存活的对象复制到另一部分内存

必知必会JVM垃圾回收——对象搜索算法与回收算法

垃圾回收(GC)是JVM的一大杀器,它使程序员可以更高效地专注于程序的开发设计,而不用过多地考虑对象的创建销毁等操作.但是这并不是说程序员不需要了解GC.GC只是Java编程中一项自动化工具,任何一个工具都有它适用的范围,当超出它的范围的时候,可能它将不是那么自动,而是需要人工去了解与适应地适用. 拥有一定工作年限的程序员,在工作期间肯定会经常碰到像内存溢出.内存泄露.高并发的场景.这时候在应对这些问题或场景时,如果对GC不了解,很可能会成为个人的发展瓶颈. 接下来的两文将详细学习下JVM中垃圾

JVM(四)垃圾回收的实现算法和执行细节

全文共 1890 个字,读完大约需要 6 分钟. 上一篇我们讲了垃圾标记的一些实现细节和经典算法,而本文将系统的讲解一下垃圾回收的经典算法,和Hotspot虚拟机执行垃圾回收的一些实现细节,比如安全点和安全区域等. 因为各个平台的虚拟机操作内存的方法各不相同,且牵扯大量的程序实现细节,所以本文不会过多的讨论算法的具体实现,只会介绍几种算法思想及发展过程. 垃圾回收算法 1.标记-清除算法 标记-清除算法是最基础的算法,像它的名字一样算法分为"标记"和"清除"两个阶段