java GC垃圾回收

目录

 

GC垃圾回收浅谈

一:什么是GC(垃圾回收)

二:回收的步骤有2步:

三:三种类型的回收算法:

四:回收机制

五:java垃圾收集器的历史

第一阶段,Serial(串行)收集器

第二阶段,Parallel(并行)收集器

第三阶段,CMS(并发)收集器

第四阶段,G1(并发)收集器

注:与垃圾回收相关的JVM参数:


GC垃圾回收浅谈

Java SE 8GC官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/

一:什么是GC(垃圾回收)


垃圾回收GC:garbage collection的简写,回收内存中不再使用的对象。
代码中可以通过System.gc() 或Runtime.getRuntime().gc()显示调用,但JVM不一定会执行,在java诞生初,JVM管理内存,降低初学者门槛是一大亮点;java广泛被应用的今天,内存的不可控只可调优,已非优势。

二:回收的步骤有2步:


1查找内存中不再使用的对象
1)引用计数法:有对像引用时计数加1,引用释放时计数减1,当引用计数为0时,对像被回GC清理。

2)根搜索算法
根搜索算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
GC roots:tracing GC的“根集合”,就是一组必须活跃的引用。

2释放这些对象占用的内存


三:三种类型的回收算法:

1.标记-复制

它将可用内存容量划分为大小相等的两块,每次只使用其中的一块。当这一块用完之后,就将还存活的对象复制到另外一块上面,然后在把已使用过的内存空间一次理掉。它的优点是实现简单,效率高,不会存在内存碎片。缺点就是需要2倍的内存来管理。

2.标记-清理

标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对象。它的优点是效率高,缺点是容易产生内存碎片。

3.标记-整理

标记操作和“标记-清理”算法一致,后续操作不只是直接清理对象,而是在清理无用对象完成后让所有 存活的对象都向一端移动,并更新引用其对象的指针。因为要移动对象,所以它的效率要比“标记-清理”效率低,但是不会产生内存碎片。

四:回收机制

把内存分成新生代和老年代,新生代存放刚创建的和存活时间比较短的对象,老年代存放存活时间比较长的对象。这样每次仅仅清理年轻代,老年代仅在必要时时再做清理可以极大的提高GC效率,节省GC时间。早期java内存的回收机制会被分成三种级别
Minor gc:回收年轻代。
Major gc:回收老年代。
Full gc:整理整个空间
事实上三种级别中,大部分Major gc是由Minor gc后调用的,所以Major gc和Full gc是同一个过程.
Minor gc在年轻代满时触发.
Full gc或者说Major gc的触发条件:System.gc时触发(非必然) ,老年代不够用时触发.

jvm内存图如下,GC回收堆和方法区所占用的内存.

方法区的回收有两种:常量池中的常量,无用的类信息,常量的回收很简单,没有引用了就可以被回收。

五:java垃圾收集器的历史

为了软件项目运行的更加完美,让我们详情了解一下GC的前生今世。

第一阶段,Serial(串行)收集器

在jdk1.3.1之前,java虚拟机仅仅能使用Serial收集器。 Serial收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。

PS:开启Serial收集器的方式

-XX:+UseSerialGC

第二阶段,Parallel(并行)收集器

Parallel收集器也称吞吐量收集器,相比Serial收集器,Parallel最主要的优势在于使用多线程去完成垃圾清理工作,这样可以充分利用多核的特性,大幅降低gc时间。

PS:开启Parallel收集器的方式

-XX:+UseParallelGC -XX:+UseParallelOldGC

第三阶段,CMS(并发)收集器

CMS收集器在Minor GC时会暂停所有的应用线程,并以多线程的方式进行垃圾回收。在Full GC时不再暂停应用线程,而是使用若干个后台线程定期的对老年代空间进行扫描,及时回收其中不再使用的对象。

PS:开启CMS收集器的方式

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC

第四阶段,G1(并发)收集器

G1收集器(或者垃圾优先收集器)的设计初衷是为了尽量缩短处理超大堆(大于4GB)时产生的停顿。相对于CMS的优势而言是内存碎片的产生率大大降低。

PS:开启G1收集器的方式

-XX:+UseG1GC

注:与垃圾回收相关的JVM参数:

-Xms / -Xmx — 堆的初始大小 / 堆的最大大小
-Xmn — 堆中年轻代的大小
-XX:-DisableExplicitGC — 让System.gc()不产生任何作用
-XX:+PrintGCDetails — 打印GC的细节
-XX:+PrintGCDateStamps — 打印GC操作的时间戳
-XX:NewSize / XX:MaxNewSize — 设置新生代大小/新生代最大大小
-XX:NewRatio — 可以设置老生代和新生代的比例
-XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布
-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和最大值
-XX:TargetSurvivorRatio:设置幸存区的目标使用率
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值