java的垃圾回收(GC)详解

java的垃圾回收(GC)详解Java 堆 JavaHeap 是 JVM 所管理的内存中最大的一块 堆又是垃圾收集器管理的主要区域 这里我们主要分析一下 Java 堆的结构 Java 堆主要分为 2 个区域 新生代与老年代 java1 8

大家好,欢迎来到IT知识分享网。

文章目录:

1.什么是垃圾回收?

GC的历史(了解):

2.怎么自定义垃圾?

1、引用计数算法(Python

2、可达性分析算法(根搜索算法,追踪性垃圾收集)

3.怎么回收垃圾?

1.标记清除算法:​编辑

2.复制回收算法:

3.标记整理算法 :

4.分代收集算法:

堆内存模型 与 回收策略(分代收集):

1.Eden 区:

2.Survivor 区:

3.Old 区:

4.为什么需要两个Survivor区?

针对以下几种情况也会进入老年代:

大对象:

长期存活对象:

内存碎片:

回收器选择:

1、Serial收集器(单线程)

2、ParNew收集器(多线程)

3.Parallel Scavenge(多线程)8

4.Serial Old(单线程)

5.Parallel Old(多线程)8

6、CMS收集器(多线程)

7、G1收集器

java的垃圾回收(GC)详解

1.4 怎么回收垃圾?

引用计数法:在Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用,即他们的引用计数都不为0,则说明对象不太可能再被用到,那么这个对象就是可回收对象。

可达性分析

1.4 怎么回收垃圾?

分代收集理论——经验法则

标记-清除——效率不稳定、空间碎片化。最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。

标记-复制——为了解决Mark-Sweep算法内存碎片化的缺陷而被提出的算法。按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。新生代MinorGC使用这个。

标记-整理——结合了以上两个算法,为了避免缺陷而提出。标记阶段和Mark-Sweep算法相同,标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。老年代FullGC使用这个。 

        Java 堆(Java Heap)是JVM所管理的内存中最大的一块,堆又是垃圾收集器管理的 主要区域,这里我们主要分析一下 Java 堆的结构: Java 堆主要分为2个区域-新生代与老年代(java1.8之后),其中新生代又分 Eden 区和 Survivor 区,其中 Survivor 区又分 From 和 To 2个区。
Minor GC 、 Major GC 、 Full GC ?
        新生代内存不够用时候发生Minor GC 也叫 Yong GC ,老年代内存不够的时候发生 Major GC, Minor GC 相比 Major GC 更频繁,回收速度也更快。 还有一种GC 负责整个新生代 + 老年代的回收称为 Full GC.


 

1、Serial收集器(单线程)
是新生代,一个单线程的收集器,采用的是复制算法;
现在依然是虚拟机运行在Client模式下的默认新生代收集器,主要就是因为它简单而高效
2、ParNew收集器(多线程)
        其实就是Serial收集器的多线程版本,采用的也是复制算法,他也是新生代;
        ParNew收集器在单CPU环境中绝对不会有比Serial收集器更好的效果;
        是许多运行在Server模式下虚拟机首选的新生代收集器,重要原因就是除了Serial收集器 外,只有它能与CMS收集器配合工作;
3.Parallel Scavenge(多线程)8
        收集器是一个新生代的多线程收集器(并行收集器),它在回收期间不需要暂停其他用户线
程,其采用的是复制算法,该收集器与前两个收集器有所不同,它主要是为了达到一个可控 的吞吐量。
4.Serial Old(单线程)
        收集器是针对老年代的收集器,采用的是标记整理算法。
它的优点是实现简单高效,但是缺
点是会给用户带来停顿。
5.Parallel Old(多线程)8
        Parallel Scavenge收集器的老年代版本(并行收集器),使用多线程和标记整理算法。

6、CMS收集器(多线程)
        是一个老年代收集器,基于标记清除算法,设计目标是尽量减少停顿时间,存在着内存碎片化问
题,所以难以避免长时间运行情况下发生full GC,导致恶劣的停顿另外,既然强调了并发, CMS 会占用更多 CPU 资源,并和用户线程争抢。
7、G1收集器
        G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多台处理器及大量内存的
机器以及高概率满足gc定顿时间同时,还具备吞吐量高性能特征:





查看jdk默认垃圾收集器 java -XX:+PrintCommandLineFlags -version
查看堆内存中各个区的使用率 java -XX:+PrintGCDetails -version

















                                                        

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/124477.html

(0)
上一篇 2025-10-07 12:45
下一篇 2025-10-07 13:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信