`
youyu4
  • 浏览: 435395 次
社区版块
存档分类
最新评论

JVM之垃圾回收过程

 
阅读更多

JVM之垃圾回收过程

 

为什么要垃圾回收

 

      前面谈到过,JVM中的设计是操作和数据分离,临时变量和操作运算在栈中运行,对象和数组存储在堆中,当栈运行完就会释放消耗的内存,但是堆不知道什么时候运行完,所以对象就会一直堆在那里越堆越多,直至内存被耗尽,幸好Java提供垃圾回收机制,将程序员从内存释放中解放出来,集中精力在业务开发上。

 

 

 

启动垃圾回收

 

System.gc() 和 Runtime.gc() 会向JVM发送GC的请求,但JVM不能保证一定会执行GC,因为一般GC的执行,都是因为内存不足引起的。

 

 

 

垃圾回收的过程



 

  1. Eden:当对象创建后,会被存储在新生代的Eden区中
  2. Survivor(S0):当Eden满了,就会进行一个Minor GC,将存活的对象复制到S0,然后清空Eden
  3. Survivor(S1):当再次放生Minor GC时,就会对Edon和S0一起进行垃圾回收,将存活的对象复制到S1,然后清空Eden和S0
  4. 年轻代垃圾回收就是上面的三步,不断地复制清除
  5. 老年代:在年轻代中进行垃圾回收存活的对象有一个岁数,垃圾回收一次就会加一,默认值是15,当到达临界年龄,对象就会被复制到老年代
  6. 当老年代的被占满,无法再进入对象时,就会进行一次Full GC,这个垃圾回收的时间比较长

注意:大对象、大数组会直接晋升到老年代

   

 

 

GC触发的条件

 

  • Minor GC触发条件:大多数情况下,空间会在Eden进行分配。如果Eden没有足够空间,就会发起一次Minor GC
  • Full GC触发条件:同理,当老年代没有足够的空间时,进行一次Full GC(Full GC = Minor GC + Major GC)

实际上,GC的触发条件要更复杂:

 

在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果大于则进行Minor GC,否则看HandlePromotionFailure设置是否允许担保失败(不允许则直接Full GC)。如果允许,会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则尝试进行Minor GC(如果失败也会触发Full GC),如果小于则直接进行Full GC

 

 

 

哪些情况下会出现Full GC

 

  • 老年代空间不足,由于大对象,大数组可能会直接把老年代挤爆,所以减少使用大对象、大数组
  • 永久代空间满了,有加载的类、反射的类,调用的方法太多,导致永久代满了,所以要适当增大永久代
  • 新生代垃圾回收后,晋升到老年代的大小大于老年代的剩余空间
  • 设置Full GC的周期时间,如果是并行的话,设置MaxGCPauseMillis。
  • 大小: 40 KB
分享到:
评论

相关推荐

    JVM常用垃圾回收器的特性与使用场景.md

    该文档总结了JVM主要的七种垃圾回收器特点与区别,分别描述了他们作用于堆内存的哪些区域,采用单线程还是多线程工作方式,在运行过程中是否需要暂停其他用户工作线程。是笔者对周志明老师的《深入理解java虚拟机》...

    JVM之基本的垃圾回收算法汇总

    这是最早的垃圾回收算法之一。它分为两个阶段:标记和清除。首先,从根节点开始遍历所有可达对象,标记所有被引用的对象;然后,清除未被标记的所有对象,释放它们占用的内存。这种算法简单直观,但有两个主要缺点:...

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

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

    jvm_gc.rar_jvm_垃圾回收

    垃圾回收是JVM自动管理内存的过程,其目标是回收不再使用的对象所占用的空间,防止内存泄漏。 1. ** Minor GC**:针对年轻代的垃圾回收,主要清理Eden区和一个Survivor区。当Eden区满时,会触发Minor GC,将存活的...

    Java+JVM+垃圾回收机制

    - **概念**: 这是最原始的垃圾回收算法之一,分为标记和清除两个阶段。 - **标记阶段**: 从根节点开始遍历所有的引用链,将所有可达的对象标记为非垃圾。 - **清除阶段**: 清除未被标记的对象所占用的空间。需要注意...

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

    1. 使用可再生能源:在 ARM 服务器中,可以考虑使用可再生能源,如太阳能、风能等,来为垃圾回收过程提供能源,这样可以降低对有限能源的依赖,减少能源消耗。 2. 增加垃圾桶数量:在 ARM 服务器中,可以设置多个...

    JVM垃圾回收原理

    ### 四、分代垃圾回收过程演示 接下来,我们将通过一个示例来展示分代垃圾回收的过程。 假设初始状态为: - **Eden区**:100%可用 - **Survivor区 S1 和 S2**:空 - **老年代**:空 1. 新对象A在Eden区生成。 2....

    jvm内存模型以及垃圾回收机制.pptx

    Java虚拟机(JVM)内存模型和垃圾回收机制是Java开发中至关重要的概念。本文将深入探讨这两个主题,帮助理解JVM如何管理和优化内存。 **一、类加载器和双亲委派机制** 类加载器是JVM的一个组成部分,负责加载Java...

    详解JVM的垃圾回收算法来做细节.docx

    总结,JVM的垃圾回收算法是一个复杂且精细的过程,涉及到多方面的技术,如根节点枚举、安全点/区域的确定、记忆集和卡表的使用,以及优化GC性能的低延迟策略。理解这些细节有助于更好地理解和优化Java应用的内存管理...

    JVM的垃圾回收机制详解和调优

    Java虚拟机(JVM)的垃圾回收(Garbage Collection,简称GC)机制是其自动内存管理的关键组成部分。Java语言并没有强制要求JVM必须包含GC,但现代JVM实现如HotSpot都内置了GC,以自动回收不再使用的对象所占用的内存...

    浅析JVM垃圾回收的过程

    本文将深入探讨JVM垃圾回收的基本过程,主要包括三个关键步骤:枚举根节点、标记和清除/回收。 1. **枚举根节点** 在垃圾回收开始时,首先要确定哪些对象是仍然在使用的,即GC Roots。这些对象包括: - 虚拟机栈...

    JVM垃圾回收艺术

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

    JVM内存管理和垃圾回收

    **垃圾回收**是JVM自动回收不再使用的内存的过程。主要有以下几种算法: - **标记-清除算法**:标记所有活动对象,然后清除未被标记的对象。缺点是会产生大量碎片。 - **复制算法**:将内存分为两块,每次只使用一...

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

    3. 垃圾回收过程 - 标记:找出所有活动对象。 - 清除:删除未被标记的对象。 - 整理:移动存活对象,紧凑内存空间。 4. Stop-the-World事件 - 当垃圾回收器运行时,程序会暂停,这可能导致性能下降。 - CMS和...

    JVM垃圾回收及监控优化1

    虚引用则主要用于跟踪对象在垃圾回收过程中的状态,不直接阻止对象被回收。 了解废弃常量和无用类的判断规则也有助于优化内存使用。废弃常量是指不再被任何地方使用的常量,无用的类则是在加载后从未被使用且无法再...

    java高级之垃圾回收机制

    本文将详细介绍Java中的垃圾回收机制及其工作原理,并探讨JVM如何管理和优化垃圾回收过程。 #### 二、JVM内存模型 JVM内存模型主要包括永久代(Permanent Generation, PermGen)、堆(Heap)和栈(Stack)三大部分。值得...

    JVM中[垃圾回收器]的所有内容-pdf

    Java虚拟机(JVM)中的垃圾回收器(Garbage Collector, GC)是Java程序自动管理内存的关键组件。垃圾回收器负责识别不再使用的对象并回收它们所占用的内存,以防止内存泄漏并确保程序的稳定运行。理解不同类型的垃圾...

    jvm垃圾回收机制详解,学习过程,如有侵权请联系删除

    Java虚拟机(JVM)的垃圾回收机制是Java开发中至关重要的一个概念,它负责自动管理内存中的对象,确保程序的稳定运行。垃圾回收(GC)是JVM内置的一种内存管理策略,旨在防止内存泄漏和内存溢出。当对象不再被程序...

    JVM内存管理和垃圾回收知识.pdf

    Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它涉及到程序的性能和稳定性。本文主要探讨了JVM如何处理内存分配、垃圾检测与回收,以及各种策略和性能指标。 首先,垃圾回收是JVM的一项核心...

Global site tag (gtag.js) - Google Analytics