gzip是使用什么算法 java java中gc是什么意思的缩写

您所在的位置:网站首页 缩写bs是什么意思 gzip是使用什么算法 java java中gc是什么意思的缩写

gzip是使用什么算法 java java中gc是什么意思的缩写

2023-07-17 16:54| 来源: 网络整理| 查看: 265

前言:

GC全称Garbage Collection,它是Java语言的垃圾回收机制。在Java语言中,不需要程序员去专门编写内存回收和垃圾清除的代码,JVM会自动管理内存和清除垃圾。因此,减少了程序员对垃圾回收的关注度并降低了开发的难度,同时也减少了内存泄露和溢出引发的问题。那Java的垃圾回收机制已经“自动化”了,我们为什么还要了解GC和内存分配呢?原因是:如何我遇到内存溢出、内存泄漏和在高并发系统中GC成为系统运行瓶颈时,我们可以找出根本原因,从而进行优化。下面,我们先来学习一下GC机制的基础知识:

正文:Q&A1:GC是什么?为什么要有GC?

GC(Garbage Collection)是垃圾收集,Java提供的GC功能可以自动监测对象是否超过作用域,从而达到自动回收内存的目的。Java语言没有提供释放已分配内存的显示操作方法。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。

Q&A2:Java回收机制(如何判定垃圾对象、如何回收,何时回收):1)如何判定对象为垃圾对象:引用计数算法:

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器为0的对象就是不可能再被使用的。

优点:执行速度快。

缺点:无法检测堆中对象的相互引用(堆栈不存在引用的堆中对象),此时计数器不为0,不能被检测回收。

可达性分析算法(主流实现方式):

一系列的GCRoots(垃圾回收根节点)对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GCRoots没有任何引用链时,则证明此对象是不可用的。

GCRoots对象(四种):

JVM栈中引用的对象(栈帧中的本地变量表);方法区中类静态属性引用的对象;方法区中常量引用的对象;本地方法栈中引用的对象。

2)生存还是死亡(何时回收):

对象至少要经历两次标记过程才能被回收。对象在进行可达性分析后,如果没有与GC Roots相连接的引用链,将会被第一次标记并且进行一次筛选(筛选条件:对象是否有必要执行finalize()方法);如果对象有必要执行finalize()方法,会将对象放置到F-Queue队列之中,稍后GC将对F-Queue中的对象进行第二次小规模的标记;如果对象在finalize()中成功拯救自己,将从队列移除,反之,它基本上就真的被回收了。

3)垃圾收集算法(如何回收):标记-清除算法:

首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象

缺点:效率不高,清除之后会产生大量不连续的内存碎片,分配较大对象时,无法找到连续内存而提前触发另一次GC。

 复制算法:

将可用内存划分为大小相等的两块,每次只使用其中的一块。当内存用完时,将存活着对象复制到另一块,然后再清除使用过内存空间。

优点:效率高。

缺点:内存缩小了一半,浪费内存。

场景:商业JVM都采用该算法回收新生代,,但不是1:1来划分内存空间,而是将内存分为一块Eden空间和两块Survivor空间(8:1:1)。

 标记-整理算法:

标记过程与“标记-清除”算法一样,但后续不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

场景:老年代内存回收

 分代收集算法(Generational Collection):

商业JVM的GC都采用该算法,该算法把Java堆分为新生代和老年代,新生代用复制算法,老年代用“标记—清理”或“标记—整理”算法。

Q&A3:Java的垃圾收集器有哪些?0)分类:分代收集:

概念:根据对象存活周期将内存划分为新生代、老年代、永久代。然后根据年代特点采用合适的GC算法。

新生代的GC收集器:Serial、ParNew、Parallel Scavenge

老年代的GC收集器:Serial Old、Parallel Old、CMS

Tips:

新生代和老年代GC收集器联合使用完成GC,存在连线可以搭配使用。

分区收集:

概念:将整个堆空间划分为连续的不同小区间,每个小区间独立使用,独立回收,好处:可以控制一次回收多少个小区间,根据目标停顿时间,,每次合理地回收若干个小区间。

分区GC收集器(新生代和老年代):G1

1)Serial 收集器(GC日志标识:DefNew):

最基本的收集器(JDK 1.3.1之前唯一的选择),它是一个单线程的收集器,它进行GC时,必须暂停其他所有的工作线程(Stop The World)。

优点:简单而高效、没有线程交互的开销,Client模式下新生代常用收集器

缺点:用户停顿感体验差(Stop The World)

2) ParNew收集器(paralle new,GC日志标识:ParNew):

Serial收集器的多线程版本,只有ParNew能与CMS配合工作。

优点:多CPU环境收集效率比Serial强, Server模式下新生代首先收集器

缺点:用户停顿感体验差(Stop The World)

3) Parallel Scavenge(吞吐量优先收集器,GC日志标识:PSYoungGen):

并行的多线程收集器,可控制吞吐量的收集器。

优点:精确控制吞吐量,减少GC停顿时间

缺点:缩短GC停顿时间时,它会牺牲吞吐量和新生代空间(10s收集一次、每次停顿100ms,现在5s收集一次、每次停顿70ms)

4) Serial Old收集器(GC日志标识:Tenured):

Serial的老年代版本,一个单线程收集器,使用“标记-整理”算法

作用:它的意义是在Client模式下使用老年代收集器。如果在Server模式下,一种用途:它与Parallel Scavenge搭配使用(JDK 1.5以及之前),另一种用途:CMS收集器的后备预案(并发收集发生Concurrent Mode Failure时使用)。

5)Parallel Old收集器(GC日志标识:ParOldGen):

Parallel Scavenge的老年代版本,使用“标记-整理”算法,弥补了之前Parallel Scavenge + Serial Old的尴尬组合。

6)CMS收集器(Concurrent Mark Sweep):

并发的“标记-清理”收集器,它是一款以获取最短回收停顿时间为目标的收集器, 重视服务的响应速度。

优点:并发收集,低停顿

缺点:CPU资源敏感(CUP资源少,CMS会影响程序执行速度)、无法处理浮动垃圾(CMS并发清理阶段用户线程还在运行,这段时间就可能产生新的垃圾叫做浮动垃圾)、标记-清除算法会产生大量空间碎片(大对象难找到连续的空间, 导致触发Full GC)

运行步骤:初始标记、并发标记、重新标记、并发清除

Tips:CMS运行期间预留内存无法满足程序需要,就会出现“concurrent Mode Failure”失败,这是JVM会临时启动Serial Old来重新进行老年代GC。

7)G1收集器(Garbage First):

概念:一款面向服务端应用的垃圾收集器。

特点:并行与并发、分代收集(收集新生代和老年代)、空间整合(整体基于“标记—整理”算法,局部(两个Region之间)基于“复制”算法)、可预测的停顿。

优点:标记-整理算法,不产生内存碎片;可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。

G1基于SATB的并发标记,包括4个阶段:初始标记、并发标记、最终标记、筛选收集。

Q&A4:Minor/Young/Major/ Full  GC有什么区别?

MinorGC发生(清理)在Eden区;Young GC发生(清理)在Eden、S0、S1区;Major GC发生(清理)在Old区;Full GC 发生(清理)整个堆空间。

gzip是使用什么算法 java java中gc是什么意思的缩写_老年代

Q&A5:Minor GC 过程是什么?概述

Minor GC采用复制算法,Minor GC发生在新生代,整体过程:复制—>清空—>互换。

具体操作:

i. Eden、ServicorFrom复制到ServicorTo,年龄+1;(如果年龄到达老年标准,赋值到老年代;如果ServicorTo内存不够,通过内存担保赋值到老年代)

ii. 清空Eden和ServicorFrom;

iii. ServicorTo与ServicorFrom互换,原ServicorTo成为下一次GC时的 ServicorFrom(即To,From是逻辑概念,S0,S1是物理概念)。

相关概念:

分配担保:如果另外一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制进入老年代。

商业JVM的新生代空间划分比例:Eden、Survivor0、Survivor1(8:1:1)、(-XX:SurvivorRatio=8)

Q&A6:HotSpot虚拟机为什么要分为新生代和老年代?

HotSpot根据对象存活周期将内存分块,它把Java堆分为新生代(Eden)和老年代(Survivor),然后根据各个年代的特点采用合适的收集算法。在新生代中,每次GC时都有大批对象死去,只有少量存活,所以选用复制算法(只需要付出少量存活对象的复制成本就可以完成收集)。在老年代中,对象存活率高、没有额外空间对它进行分配担保,所以使用“标记-清理”或“标记-整理”算法来回收。

Q&A7:HotSpot虚拟机GC的分类有哪些?Partial GC(分代式收集):

并不收集整个GC堆的模式

Young GC:只收集young gen的GC

Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式

Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式

Full GC(全部收集):

收集整个堆,包括young gen、old gen、perm gen(如果存在的话)等所有部分的模式。

Q&A8:HotSpot 虚拟机GC的触发条件是什么?Young GC:

Eden区分配满的时候触发,Young GC时,有部分存活对象会晋升到old gen,所以young GC后old gen的占用量通常会有所升高。

Full GC:

i. 老年代没有足够的空间时,发生Full GC;

ii. 准备要触发Young GC时,统计要晋升old gen的对象大于目前old gen剩余的空间时,则不会触发Young GC,而是触发Full GC(除了CMS收集器之外,Full GC至少伴随一次Young GC);

iii. 如果有永久代的话,在永久代需要分配空间但已经没有足够空间时,也要触发一次Full GC(JDK1.8后,没有永久代);

iv. System.gc()默认触发Full GC;

v. heap dump(堆转储文件,是一个Java进程在某个时间点上的内存快照)带GC默认触发Full GC;

vi. CMS GC时出现Concurrent Mode Failure会导致一次Full GC的产生。

Q&A9:什么情况下新生代对象会晋升到老年代?

先导概念:

JVM给每个对象定义了一个对象年龄(age)计数器;对象在Survivor区中每熬过一次Minor GC,年龄增加一岁。

i. 新生代的GC收集器为Serial或ParNew,设置-XX:PretenureSizeThreshold参数(设置“大对象”的大小),当对象大于这个值时,被认为是大对象,直接进入老年代;       

ii. Young GC后,如果对象太大无法进入Survivor区,则会通过分配担保机制进入老年代;

iii. 对象的年龄增加到一定程度(默认15岁,或设置-XX:MaxTenuringThreshold参数),就将会被晋升到老年代中;

iv. 在Survivor区中所有相同年龄对象大小的总和大于Survivor空间的一半时,大于或等于该年龄的对象就可以直接进入老年代,无须等待年龄参数设置的值。

Q&A10:Full GC后老年代的空间反而变小?

HotSpot虚拟机的Full GC实现中,默认新生代里所有活的对象都要晋升到老年代,实在晋升不了才会留在新生代。如果Full GC的时候,老年代里的对象几乎没有死掉的,而新生代又要晋升活对象上来,那么Full GC结束后老年代的使用量自然就上升了。

Q&A11:GC一定会导致停顿吗,为什么一定要停顿?

GC进行时必须暂停所有Java执行线程,称为Stop  The  World。

原因:可达性分析过程中不允许对象的引用关系还在变化,否则无法保证可达性分析的准确性。GC只会在“安全点”和“安全区”内开始。

Q&A12:什么是安全点与安全区?0) OopMap:

概念:记录了栈上本地变量到堆上对象的引用关系。

作用:避免全栈扫描,加快枚举根节点的速度;实现HotSpot JVM的准确式GC。

1) 安全点:

概念: JVM在一些特定的位置记录OopMap信息,这些位置称为“安全点”,运行的程序(获得CUP时间的线程)只有在“安全点”才能GC。

如何让所有线程“跑”到“安全点”?

抢先式中断:不需要线程的执行代码主动配合,GC发生时,中断所有线程,如果发现有线程不再“安全点”上,就恢复线程,让它“跑”到“安全点”上(几乎不用这种方案)。

主动式中断:设置一个标志,每个线程主动轮询这个标志,发现中断标志为真就挂起自己。轮询标志的地方:它与“安全点”重合,然后再加上创建对象分配内存的地方(HotSpot  JVM使用)。

2) 安全区:

概念:在一段代码片段中,引用关系不会发生变化,在该区域GC都是安全的,它可以理解成是“安全点”的拓展。

作用:解决没有分配CPU时间的线程,无法响应JVM的中断请求,“跑”到“安全点”去挂起的问题。

使用:代码执行到“安全区”时,首先标识自己进入了“安全区”,在这段时间里发起GC,就不用管标识自己为“安全区”的线程,在线程离开安全区域时,会检查是否正在执行GC,如果执行GC就等完成后再离开安全区域。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3