`

JVM垃圾回收

阅读更多
垃圾可分为:年青代,年老代,持久代。

1. Young(年轻代)
分为三个分区,一个Eden区,两个Survivor区。大部分对象在Eden中生成,Eden满,还存活的对象被复制到其中一个survivor区。当这个survivor满时,存活的对象被复制到另一个Survivor区。当这个survivor区也满了得时候,从第一个survivor区复制过来的,且还存活的对象将被复制到“老年区(Tenured)”。被复制到老年区的只有从另一个survivor区复制过来的对象。survivor区总有一个是空得。

2.Tenured(年老代)
存放从年轻代存活的对象。一般年老带存放的都是生命期较长的对象。

3.Perm(持久代)
用于存放静态文件,如JAVA类,方法等。持久代对垃圾回收没有显著影响。

大部分对象被分配到Eden space,并且大部分对象在该区域被释放。当进行minor GC的时候,VM会把剩下的没有释放的对象从Eden space移动到其中一个survivor space中。此外,vm会把长期存活在survivor spaces里面的对象移动到老年代的Tenured space中。 当Tenured generation填满后,会产生一次FULL GC。 Full GC比较慢,因为回收的内容包括了所有的live状态的对象。

GC的类型:Scavenge GC 和Full GC

Scavenge GC:一般情况下,新对象生成,申请Eden空间失败时触发。将Eden区进行GC,清除非存活对象,并把尚且存活的对象移动到survivor区,然后整理Survivor的两个区。

Full GC: 对整个堆进行整理,包括Young, Tenured 和 perm。
如下原因可导致full GC:Tenured被写满,Perm区域被写满,System.gc()被显示调用。

垃圾收集器
负责收集年轻代的垃圾收集器:serial,ParNew,ParallelScavenge
负责收集老年代的垃圾收集器:CMS,Serial Old, Parallel Old
同时收集年轻代和年老代的垃圾收集器:Garbage First(G1)

其中,serial Old能与serial, ParNew, ParallelScavenge三款垃圾收集器组合。
CMS只能与serial,ParNew组合,且会添加serial-old。在CMS出现concurrent Mode Failure时用serial-old代替CMS进行Full GC。

Parallel Old只能与ParallelScavenge搭配。

serial是一个单线程收集器。“单线程”分两部分理解。第一,只有一条线程负责垃圾回收。第二,垃圾回收时,必须暂停其他所有的工作线程。
优点:简单高效。在单CPU环境中,Serial收集器由于没有线程交互的开销,能获得最高的单线程收集效率。在用户桌面应用中,分配给虚拟机管理的内存不会太大,收集停顿时间完全可以控制在几十毫秒, 只要不频繁发生,停顿完全可以接受。因此在client模式下地虚拟机Serial收集器是一个不错的选择。

ParNew收集器:是Serial收集器的多线程版本。使用多条线程进行垃圾回收,其余行为与Serial收集器完全相同。

ParallelScavenge收集器:也是并行的多线程收集器。该收集器的目标是达到一个可控制的吞吐量(吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间))。
停顿时间越短越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。

可以用控制最大垃圾收集停顿时间的 -XX : MaxGCPauseMillis参数以及直接设置吞吐量大小的参数-XX: GCTimeRatio参数来精确控制吞吐量。

注意:MaxGCPauseMills越小不代表垃圾回收的速度越快,缩短GC停顿时间是通过减少吞吐量以及减少新生代空间来换取的。减少新生代空间即原本收集500M大小变为300M;减少吞吐量——原来每10秒收集一次,每次停顿100ms,现在改为5秒一次,每次停顿70ms。虽然暂停时间减少了,但吞吐量下降了。
通过-XX:UseAdaptiveSizePolicy虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。自适应调整策略也是Parallel Scavenge收集器与ParNew收集器的一个重要区别。

年轻代收集器使用的算法都是拷贝算法。

Serial Old收集器:Serial收集器的老年代版本。标记-清除算法

Parallel Old收集器:在Parallel Old出现之前,ParallelScavenge收集器只能和serial - old搭配使用。由于Serial-old收集器在服务器端应用性能上的“拖累”,使得Parallel Scavenge收集器未必能再整体应用上获得吞吐量的最大化的效果。由于单线程的老年代收集中无法利用服务器多CPU的处理能力,因此这种组合的吞吐量甚至不一定有ParNew+CMS的组合“给力”。
Parallel old + Parallel Scavenge的组合在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑。

CMS: concurrent Mark Sweep收集器是一种以获取最短停顿时间为目标的收集器。适合重视服务的响应速度,希望停顿时间短的应用。

分为4个步骤
1. 初始标记:只标记GC Root能直接关联到的对象,需要暂停其他线程,但时间很短。
2. 并发标记:进行GC Root的tracing过程。这段时间比较长,但不暂停其他线程。与用户线程并发执行。
3. 重新标记:需要暂停其他线程,为了修正并发标记期间因用户继续运作而导致标记产生变动的那一部分对象的标记,停顿时间比初始标记长,但远小于并发标记时间。
4.并发清除:不需要暂停用户线程。

缺点:
1. 对CPU资源非常敏感。
2. 无法处理浮动垃圾,可能出现“Concurrent Mode Failure”。
    CMS并发清理阶段用户线程还在运行着,伴随程序运行自然会产生新的垃圾,这部分垃圾出现在标记过之后,CMS无法处理它们,只能留待下一次GC时再清理掉。这部分垃圾称为“浮动垃圾”。
    由于垃圾收集阶段用户线程还需要运行,那就还需要预留足够的内存空间给用户线程使用。因此CMS不能等到老年代几乎用完再收集,需要预留一部分空间提供并发收集时的程序运作使用。 可通过-XX: CMSInitialtingOccupancyFraction来设置触发垃圾回收的百分比。 要是CMS运行期间预留内存无法满足程序需要,会出现一次“Concurrent Mode Failure”,这时虚拟机启用后备方案:临时启动Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间久很长了。

3. CMS采用标记—清除算法实现,收集结束会出现大量的空间碎片。对大对象分配带来很大麻烦。


分享到:
评论

相关推荐

    JVM垃圾回收机制.xmind

    自己学习总结JVM垃圾回收机制的结构图,一起分享!!!

    JVM垃圾回收机制

    我们通过深入探讨以下几个关键点来理解JVM垃圾回收机制的工作原理: 1. 如何确定某个对象是“垃圾”? JVM垃圾回收机制通过两种主要算法来确定对象是否成为垃圾,即“可达性分析算法”和“引用计数法”。 - 可达性...

    深入探索JVM垃圾回收:ARM服务器垃圾回收的挑战和优化.docx

    深入探索 JVM 垃圾回收:ARM 服务器垃圾回收的挑战和优化 JVM 垃圾回收是 Java 内存管理的重要组成部分,其主要职责是自动释放不再被应用程序使用的内存。在现代计算机系统中,内存是一种宝贵的资源,其有效管理...

    JVM垃圾回收器和内存分配策略.zip

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收器(Garbage Collector, GC),以及内存分配策略。理解这些概念对于优化Java应用性能至关重要。本篇文章将深入探讨JVM的垃圾回收机制以及...

    JVM垃圾回收器工作原理及使用实例介绍Java开发Java

    本文将深入探讨JVM垃圾回收器的工作原理,并通过实例来帮助开发者理解和应用。 1. 垃圾回收概述 - 内存管理:Java中的内存分为堆内存和栈内存,垃圾回收主要针对堆内存。 - 对象生命周期:创建、使用、不再引用...

    JVM垃圾回收艺术

    《JVM垃圾回收艺术——探索Tenured Generation的内涵》 在深入探讨JVM垃圾回收机制的艺术之前,我们先来理解一下“天才”的定义——一种对事业、对工作的极度热爱。JAVA垃圾回收(GC)同样展现出这种对效率和优化的...

    JVM垃圾回收原理

    ### JVM垃圾回收原理详解 #### 一、相关概念与基本回收算法 在深入探讨JVM垃圾回收机制之前,我们先了解几个重要的概念及其工作原理。 ##### 1. 引用计数(Reference Counting) 引用计数是一种较为古老且简单的...

    JVM 垃圾回收(GC)

    理解JVM垃圾回收机制对于优化Java应用性能至关重要。 1. **垃圾回收的基本概念** - **对象生命周期**:在Java中,对象的生命周期包括创建、使用和销毁。当对象不再被引用时,就被认为是“垃圾”。 - **垃圾回收器...

    java jvm垃圾回收

    Java JVM 垃圾回收机制 Java 语言中一个显著的特点就是引入了垃圾回收机制,使 c++ 程序员最头疼的内存管理的问题迎刃而解,它使得 Java 程序员在编写程序的时候不再需要考虑内存管理。垃圾回收机制的意义是防止...

    垃圾回收系列(3):CLR与JVM垃圾回收器的比较宣贯.pdf

    《垃圾回收系列(3):CLR与JVM垃圾回收器的比较》 本文主要探讨了.NET框架中的CLR(公共语言运行库)与Java平台中的JVM(Java虚拟机)在垃圾回收机制上的异同。垃圾回收是现代编程环境中管理内存的重要机制,它可以...

    JVM垃圾回收与调优详解1

    《JVM垃圾回收与调优详解1》 Java虚拟机(JVM)的内存管理和垃圾回收是其性能优化的关键环节。本文主要探讨JVM内存分配、对象回收的判断标准以及垃圾收集算法。 1. JVM内存分配与回收 在JVM中,内存分为新生代、...

    jvm垃圾回收调整.pdf

    在调整JVM垃圾回收参数时,需考虑到应用的特性,如对象生命周期、内存分配模式等。过多的垃圾回收会导致应用暂停,因此合理配置堆大小和GC策略是提升系统响应速度和稳定性的关键。同时,监控JVM的垃圾回收行为,通过...

    JVM垃圾回收,参数,强软弱虚,常见错误OOM,与微服务结合.docx

    "JVM垃圾回收、参数、强软弱虚、常见错误OOM、与微服务结合" JVM垃圾回收是Java虚拟机(JVM)中的一种机制,用于自动回收无效对象所占用的内存资源。垃圾回收机制可以防止内存溢出、提高系统性能和可靠性。 在C/...

    JVM垃圾回收分享(文字在博客)

    【JVM垃圾回收分享】 Java语言的一大亮点是其自动内存管理机制,这使得开发者无需手动管理内存,从而避免了常见的内存泄漏和指针越界问题。这种机制通过垃圾回收(Garbage Collection,简称GC)来实现,确保了程序...

    09 Java基础-JVM垃圾回收-玉峰1

    JVM垃圾回收是其核心功能之一,旨在自动管理内存,避免程序出现内存泄漏或过度消耗导致的性能问题。本节将深入探讨JVM垃圾回收机制以及与之相关的工具和概念。 1. **JVM内存模型** JVM内存分为堆内存和栈内存,...

    jvm垃圾回收机制:.md

    全面概述jvm垃圾回收机制的功能、各部分组成及各部分算法实现

    JVM垃圾回收机制与GC性能调优

    Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...

    JVM垃圾回收.jpg

    jvm 垃圾回收思维导图,总结了现有的垃圾回收器的有点以及使用场景、垃圾回收算法以及回收的判断依据。

Global site tag (gtag.js) - Google Analytics