首页 > 编程知识 正文

jvm垃圾回收机制有几种,jvm有哪些垃圾回收算法

时间:2023-05-06 16:39:10 阅读:190111 作者:4627

垃圾回收算法: 4种复制算法(年轻一代)标签去除算法(老年代)标签整理算法(老年代)分代收集算法(堆内)引用计数法垃圾回收如何看服务器的默认垃圾回收器? *--在xx : printcommandlineflags-version * *中显示jvm的缺省信息

-XX:+UseG1GC

C:javaEE threads Java-xx : printcommandlineflags-version-xx : G1 concrefinementthreads=8- xx : gcdrainstacktargetsize=64 3360 min heapsize=6815736-xx : printcommandlineflags-xx 3360 reservedcodecachesize ode cache-xx 3: usecompressedclasspoing - xx 3360 use g1gc * *-xx :-uselargepagesindividuallocationjavaversion ' 13-ea ' 2019-09-17 Java (TM ) seruntimentimenvimenvial 设置64-bitserverVM(build13-ea33,混合模式,共享)垃圾收集器,以显示jps -l中当前正在运行的线程

STW :暂停整个APP应用程序;

DefNew Default New Generation

趋势科技

ParNew Parallel New Generation

PSYoungGen Parallel Scavenge

ParOldGen Parallel Old Generation

吞吐量:用户代码的执行时间/(用户代码的执行时间/垃圾回收时间)

多余的自行车在执行垃圾回收时,代替串行单线程收集器,必须暂停所有其他工作线程直到其收集完成。

在单线程中串行收集器仍然是最稳定、最高效的收集器,没有线程交互开销,可以获得最高的单线程垃圾回收效率。

因此,Serial仍然是java虚拟机客户端模式下的缺省富余自行车备用垃圾回收器。

-XX: UseSerialGC

打开后,单击young区用Serial +old区用Serial Old收集器组合

表示充裕的自行车区,旧年使用串行回收收集器,充裕的自行车费用使用复制算法,旧年使用标记-整理算法。

并行ParNew

与使用多线程进行垃圾回收而不是使用串行收集器的多余自行车进行垃圾回收相比,使用多线程进行垃圾回收,剩下的与串行相同。

-XX: UseParNewGC;

打开后,Young区为ParNew Old区使用序列old组合,建议使用java8 不再推该组合;

-XX:ParNewGCThreads限制线程数,缺省情况下打开与CPU数相同的线程数

Parallel Scavenge的同时回收(多对多) ) ) ) ) ) ) ) )。

ParNew也像充裕的自行车世代的垃圾回收器一样,是使用复制算法并行多线程的垃圾回收器。

不仅在富裕的自行车时代并行回收,在旧时代也并行回收

与ParNew的一个重要区别:自适应调节-虚拟机会根据当前系统的运行情况收集性能监控信息,动态调节参数以提供最合适的停顿时间或吞吐量;

Parallel Old 互相激活使用和充裕的自行车将取代Parallel的老一代Parallel Old

旧款Parallel Old在旧款提供了吞吐量优先的垃圾回收器jdk8后,富余自行车相互激活替代Parallel Scavenge旧款Parallel Old使用

串行old单线程采集、标记整理算法

清除CMS同时标志

Concurrent曾经的洋葱Sweep是获得最少停顿时间为目标的收藏家; 并发:与用户线程一起运行;

对于适合互联网站点和B/S的服务,这些APP应用优先考虑服务的响应速度,并最大限度地减少系统停机时间

-XX: UseConc以前的洋葱SweepGC在打开参数后会自动打开-XX: UseParNewGC;

打开参数时,请单击使用ParaNew(Yuong区)+CMS(Old区)+Serial Old(后备)的收集组合: 当CMS出错后,将CMS替换为Serial Old

CMS 四个过程:
1.初始标记 (停)
标记GCRoot能直接关联的对象;
2.并发标记
进行GCRoot跟踪过程,从前一阶段标记的对象出发,标记所有可达对象,和用户线程一起运行,主要是标记过程;
3.重新标记 (停)
修正在并发标记期间,由于用户程序也在运行而导致标记产生的变动,正式清理前的修正; 如:从从容的自行车代晋升的对象,新分配到老年代的对象以及在并发阶段被修改的对象;
4. 并发回收
清理无效对象;
引发问题 CMS是老年代的回收器,如何确定对象存活?会扫描从容的自行车代吗?
答案是会的:在扫描GCRoot对象可达,并且标记时不可避免要经过从容的自行车代:

优缺点:
优: 并发清除,停顿时间短
缺: ①:由于并发执行,cms与用户线程会同时增大对堆内存的占用,**CMS必须在堆内存用尽时完成,**否则cms失败用SerialOld 替换;从而造成较大停顿时间
②;标记清除没有整理过程,会造成空间碎片,老年代会随着时间推移而逐步耗尽,最后不得不使用担保机制 SerialOld
但是CMS提供了参数-XX:CMSFullGCsBeForeCompaction(默认0,即每次都进行内存整理),来指定多少次cms收集后进行一次压缩的full gc

从容的自行车代老年代 G1

G1横跨yuong区和old区,仍然属于分代收集器
G1(Garbage-first),是一款面向服务端应用的收集器
与G1相比 都是与应用程序并发执行;
但是:
整理空闲空间更快**,有整理内存的过程,不会产生很大的内存碎片**;
不希望牺牲大量的吞吐性能;
不需要更大的javaHeap;
需要时间去预测gc停顿时间,停顿时间更短!预测机制:用户可以指定期望的垃圾回收时间
改变:
改变了从容的自行车代老年代内存区域,不在是连续的,而是变为一个个大小一样的region,
每个regain大小从1M到32M不等,一个region可能属于从容的自行车代的Eden区、survivor区、养老区等。每个region都可能运行在不同区并且切换。

工作原理:
对于从容的自行车代的region还是采用复制算法,将存活的对象复制到老年去或survivor区
对于老年代的region采用复制算法将对象从一个区域复制到另外一个区域,完成清理工作,这就意味着不会有内存碎片的问题;
G1还有一个特殊的区域H(Humongous)区用于存储巨型对象,但一个对象占用超过了分区内存的50%,就直接被划分到老年去,这就是巨型对象,G1通过H区存储大型对象,如果一个H区装不下就寻找连续的H区来存储。

回收原理:
1.Eden区,Eden区满触发垃圾回收,主要针对小区域收集并且组成连续的内存块,避免内存碎片;
Eden区存活的数据移入Survivor区;
Survivor区移入新的Survivor区,部分数据会晋升到Old区;
Eden处理完成;
回收步骤与CMS相似

如何选择垃圾收集器? 组合:**单CPU或小内存,单机程序**-XX:+UseSerialGC

多CPU,需要最大吞吐量,如后台计算型应用
-XX:+UseParalellGC或者-XX:+UseParalellOldGC
多CPU,追求低停顿时间,需快速响应如互联网应用
-XX:+UseParNewGC或者-XX:+UseConc曾经的洋葱SweepGC

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。