JAVA垃圾回收

JAVA垃圾回收

java垃圾回收

垃圾回收 (Garbage Collection) 是一种自动的内存管理技术,用于在程序运行时自动地检测并清除不再使用的内存空间,以避免内存泄露并提高程序的效率。这种机制可以帮助程序员在一定程度上避免内存管理方面的问题。

在计算机科学中,内存是一种宝贵的资源。当程序分配内存后,如果没有及时释放不再使用的内存,就会导致内存泄露。内存泄露会导致程序运行变慢,最终可能会导致程序崩溃。

垃圾回收机制通过监控内存的使用情况,自动回收不再使用的内存。大多数现代编程语言都支持垃圾回收机制,例如Java、Python、Ruby等。使用垃圾回收机制可以使程序员专注于程序的业务逻辑,而不必担心内存管理的问题。

垃圾回收机制可以分为两种类型:标记清除 (Mark and Sweep) 和引用计数 (Reference Counting) 。标记清除机制通过标记不再使用的内存块,并清除所有的死亡对象来回收内存。引用计数机制则通过跟踪每个对象的引用数来判断对象是否应该被回收。

虽然垃圾回收机制可以减少程序员的负担,但它也会带来一些性能上的问题。垃圾回收机制需要扫描整个堆内存,以查找不再使用的对象。这个过程会消耗一定时间,并且在垃圾回收过程中,程序可能会暂停。因此,在设计程序时,需要权衡使用垃圾回收机制所带来的好处和性能损失。

总之,垃圾回收是一种自动化的内存管理技术,它可以帮助程序员避免内存泄露,提高程序的效率。但是,在使用垃圾回收机制时,需要权衡好程序的性能和内存管理的成本。

Java Development Kit (JDK)提供了许多垃圾收集器,以下是其中一些主要的垃圾收集器:

  1. Serial Garbage Collector:串行垃圾收集器是最简单的垃圾收集器,它使用单个线程进行垃圾收集。它适用于小型应用程序,因为它的缺点是垃圾收集期间会暂停应用程序的运行。
  2. Parallel Garbage Collector:并行垃圾收集器使用多个线程进行垃圾收集,并且在垃圾收集期间暂停应用程序的时间较短。它适用于大型应用程序,因为它可以充分利用多核CPU的优势。
  3. CMS Garbage Collector:CMS(Concurrent Mark Sweep)垃圾收集器是一种并发垃圾收集器,它可以在应用程序运行的同时进行垃圾收集。它适用于需要快速响应用户请求的应用程序。
  4. G1 Garbage Collector:G1(Garbage First)垃圾收集器是一种基于区域的垃圾收集器,它可以在多个CPU和内存中进行垃圾收集。它适用于大型应用程序,因为它可以有效地管理大量内存。

CMS

CMS垃圾收集器是一种并发垃圾收集器,它可以在应用程序运行的同时进行垃圾收集。它包含以下几种数据结构:

  • 可达性分析根节点:它是垃圾收集的起点,用于遍历整个对象图。
  • 标记表:它用于存储垃圾收集器标记的对象。
  • 可用空间列表:它用于存储可用的内存空间,以便于分配新对象。
  • 并发标记状态:它用于记录并发标记的状态,以便于控制并发标记的进程。

CMS垃圾收集器的核心思想是将垃圾收集过程分为多个阶段,以减少垃圾收集期间应用程序的暂停时间。具体来说,它将垃圾收集分为以下几个阶段:

  1. 初始标记阶段:它用于标记可达性分析根节点直接引用的对象,并更新标记表。这个阶段需要停止应用程序的运行。
  2. 并发标记阶段:它用于标记可达性分析根节点间接引用的对象,并更新标记表。这个阶段和应用程序并发运行。
  3. 重新标记阶段:它用于标记并发标记阶段中发生变化的对象,并更新标记表。这个阶段需要停止应用程序的运行。
  4. 并发清除阶段:它用于清除标记表中未被标记的对象,并将内存空间添加到可用空间列表中。这个阶段和应用程序并发运行。

总之,CMS垃圾收集器是一种并发垃圾收集器,它可以在应用程序运行的同时进行垃圾收集。它由可达性分析根节点、标记表、可用空间列表和并发标记状态等数据结构组成。它将垃圾收集过程分为多个阶段,以减少垃圾收集期间应用程序的暂停时间。

G1

G1垃圾收集器是一种基于区域的垃圾收集器,它可以在多个CPU和内存中进行垃圾收集。它包括以下几种数据结构:

  • 区域(Region):它是内存划分的基本单位,每个区域的大小可以在2MB到32MB之间。
  • 区域集合(Region Set):它用于存储所有区域的信息,以便于垃圾收集器的管理。
  • 活动区域集合(Active Region Set):它用于存储当前正在使用的区域。
  • 回收集合(Collection Set):它用于存储需要进行垃圾收集的区域。
  • 年轻代(Young Generation):它包括Eden区、Survivor区0和Survivor区1,用于存储新创建的对象。
  • 年老代(Old Generation):它用于存储已经存活一段时间的对象。
Untitled.png

G1垃圾收集器的核心思想是将堆内存划分为多个区域,以便于垃圾收集器进行局部化的垃圾回收。具体来说,它将垃圾收集过程分为以下几个阶段:

  1. 初始标记阶段:它用于标记年轻代中所有存活的对象,并标记与年轻代中存活对象有关的年老代中存活的对象。
  2. 并发标记阶段:它用于标记所有存活的对象,并更新各个区域的回收状态。
  3. 最终标记阶段:它用于标记并发标记阶段中发生变化的存活对象。
  4. 筛选阶段:它用于选择需要回收的区域,并进行回收。这个阶段需要停止应用程序的运行。

下面是G1收集器的一些关键特性:

  1. 分代收集:G1收集器将Java堆分为多个固定大小的区域(Region),每个区域可以是Eden区、Survivor区或Old区。这种分代的设计使得G1收集器能够更好地处理不同年龄的对象。
  2. 并发标记:G1收集器使用并发标记(Concurrent Marking)算法来标记不再使用的对象。在标记阶段,G1收集器可以与应用程序并发运行,减少停顿时间。
  3. 区域化回收:G1收集器采用了区域化的回收方式,即选择一部分Region进行垃圾回收,而不是整个堆。这种方式可以将垃圾回收的成本均摊到多个小区域上,减小了回收的停顿时间。
  4. 自适应回收策略:G1收集器具有自适应的回收策略,可以根据当前的应用程序行为和堆的使用情况来动态调整垃圾回收的行为。它会根据垃圾回收的成本、吞吐量和停顿时间等因素来决定下一次回收的区域和回收的方式。
  5. 混合回收:G1收集器可以执行混合回收(Mixed GC),即同时执行部分应用程序和部分垃圾回收的操作。这种方式可以更好地控制停顿时间,提高应用程序的响应性能。

总的来说,G1收集器在垃圾回收方面引入了很多创新的设计和算法,旨在提供更好的性能、更高的内存利用率和更可预测的停顿时间。它适用于大型的多核服务器环境,并且在应对大堆内存和长时间停顿的场景下表现优异。然而,由于每个应用程序的需求不同,G1收集器并不适用于所有场景,开发人员需要根据具体情况进行评估和调优。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 1. C语言的垃圾回收是人工的,工作量大,但是可控性高。 java是自动化的,但是可控性很差,甚至有时会出现内存溢...
    刘小刀tina阅读 348评论 0 0
  • 本文主要摘自《深入理解Java虚拟机》,内容较多,尽量全面概括了 Java 垃圾回收机制、垃圾回收器以及内存分配策...
    czwbig阅读 311评论 0 0
  • java JVM内部结构 java对象创建过程 虚拟机栈溢出测试 元空间溢出测试 JVM命令使用 JVM常用命令 ...
    虫师_银古阅读 236评论 0 1
  • 1. java的引用类型 ⚠️"强->软->弱->虚" 强度依次递减 1. 强引用(Strong Referenc...
    Sarahhhh阅读 312评论 0 0
  • 哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无非就是那些不可能...
    Java资讯库阅读 556评论 0 6