`

JVM系列二:GC策略&内存申请、对象衰老

    博客分类:
  • jvm
jvm 
阅读更多

JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类

       现在比较常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即将内存分为几个区域,将不同生命周期的对象放在不同区域里:young generationtenured generation 和permanet generation。绝大部分的objec被分配在young generation(生命周期短),并且大部分的object在这里die。当young generation满了之后,将引发minor collection(YGC)。在minor collection后存活的object会被移动到tenured generation( 生命周期比较长) 。最后,tenured generation 满之后触发major collection。major collection(Full gc)会触发整个heap的回收,包括回收young generation。permanet generation区域比较稳定,主要存放classloader信息。

       young generation有eden、2个survivor 区域组成。其中一个survivor区域一直是空的,是eden区域和另一个survivor区域在下一次copy collection后活着的objecy的目的地。object在survivo区域被复制直到转移到tenured区。

       我们要尽量减少 Full gc 的次数(tenured generation 一般比较大,收集的时间较长,频繁的Full gc会导致应用的性能收到严重的影响)。

堆内存GC
       JVM(采用分代回收的策略),用较高的频率对年轻的对象(young generation)进行YGC,而对老对象(tenured generation)较少(tenured generation 满了后才进行)进行Full GC。这样就不需要每次GC都将内存中所有对象都检查一遍。

非堆内存不GC

      GC不会在主程序运行期对PermGen Space进行清理,所以如果你的应用中有很多CLASS(特别是动态生成类,当然permgen space存放的内容不仅限于类)的话,就很可能出现PermGen Space错误。

内存申请、对象衰老过程
一、内存申请过程

  1. JVM会试图为相关Java对象在Eden中初始化一块内存区域;
  2. 当Eden空间足够时,内存申请结束。否则到下一步;
  3. JVM试图释放在Eden中所有不活跃的对象(minor collection),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;
  4. Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
  5. 当old区空间不够时,JVM会在old区进行major collection;
  6. 完全垃圾收集后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory错误";

二、对象衰老过程

  1. 新 创建的对象的内存都分配自eden。Minor collection的过程就是将eden和在用survivor space中的活对象copy到空闲survivor space中。对象在young generation里经历了一定次数(可以通过参数配置)的minor collection后,就会被移到old generation中,称为tenuring。
  2. GC触发条件
    GC类型 触发条件 触发时发生了什么 注意 查看方式
    YGC eden空间不足

    清空Eden+from survivor中所有no ref的对象占用的内存
    将eden+from sur中所有存活的对象copy到to sur中
    一些对象将晋升到old中:
        to sur放不下的
        存活次数超过turning threshold中的
    重新计算tenuring threshold(serial parallel GC会触发此项)

    重新调整Eden 和from的大小(parallel GC会触发此项)

    全过程暂停应用
    是否为多线程处理由具体的GC决定
    jstat –gcutil
    gc log
    FGC

    old空间不足
    perm空间不足
    显示调用System.GC, RMI等的定时触发
    YGC时的悲观策略
    dump live的内存信息时(jmap –dump:live)

    清空heap中no ref的对象
    permgen中已经被卸载的classloader中加载的class信息

    如配置了CollectGenOFirst,则先触发YGC(针对serial GC)
    如配置了ScavengeBeforeFullGC,则先触发YGC(针对serial GC)

    全过程暂停应用
    是否为多线程处理由具体的GC决定

    是否压缩需要看配置的具体GC
    jstat –gcutil
    gc log
    permanent generation空间不足会引发Full GC,仍然不够会引发PermGen Space错误。

参考:

http://jiangyongyuan.javaeye.com/blog/356502

http://www.helloying.com/blog/archives/164

 

相关内容推荐:

GC悲观策略之Parallel GC篇

GC悲观策略之Serial GC篇

分享到:
评论

相关推荐

    深入理解JVM&G1; GC

    G1采用了混合收集(Mixed GC)策略,能够在一次GC过程中同时回收年轻代和老年代的内存,降低了垃圾收集的开销。 G1 GC的关键特性包括: 1. **并发标记阶段**:G1使用并发标记清除算法,能在应用线程运行的同时进行...

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G)

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G) 〖课程介绍〗: 来自顶尖大厂的架构师级JVM优化与GC调优策略实战课程,是具备有尖端技术的优化课程。在课程内容上几乎不用过多的介绍,单是查阅目录就...

    JVM面试资料:JVM结构、JVM调优、四大垃圾回收算法、七大垃圾回收器

    JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel...

    深入理解JVM&G1GC

    资源名称:深入理解JVM & G1 GC内容简介:G1 GC提出了不确定性Region,每个空闲Region不是为某个固定年代准备的,它是灵活的,需求驱动的,所以G1 GC代表了先进性。《深入理解JVM & G1 GC》主要为学习Java语言的...

    JVM常用的GC策略介绍

    在Java虚拟机(JVM)中,垃圾收集(GC)是一项至关重要的任务,它自动管理程序运行时不再使用的对象内存,从而避免了手动管理内存可能导致的内存泄漏等问题。本文将详细介绍几种在JDK 1.7中常用的垃圾收集算法、策略以及...

    JVM体系结构与GC调优

    4. **内存分配与GC策略** - **年轻代与老年代**:新生代用于存放新创建的对象,老年代存放长期存活的对象。 - **对象晋升**:当对象在年轻代存活足够长的时间后,会被晋升到老年代。 - **Minor GC与Full GC**:...

    深入理解JVM & G1 GC

    《深入理解JVM & G1 GC》这篇文章和相关压缩包文件主要聚焦于Java虚拟机(JVM)的内存管理,特别是垃圾收集器(GC)的优化,特别是G1(Garbage-First)垃圾收集器的深度解析。下面将详细阐述JVM、GC的基本概念,...

    JVM下篇:性能监控与调优篇.7z

    在Java世界中,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码、管理内存以及执行线程。对于大型企业级应用,JVM的性能监控与调优是至关重要的,因为这直接影响到应用的响应速度、稳定性和...

    JVM初探- 内存分配、GC原理与垃圾收集器

    在JVM中,垃圾回收(GC)是自动管理内存的关键技术,其目的是回收不再使用的对象所占用的内存空间,以避免内存泄漏和提升系统性能。 首先,JVM内存分配策略主要涉及对象如何在堆内存的不同区域进行分配。对象在...

    JVM性能调优-JVM内存整理及GC回收.pdf_java_jvm_

    《JVM性能调优——JVM内存整理及GC回收》是针对Java开发人员的重要主题,尤其是在大型企业级应用中,确保JVM(Java虚拟机)的高效运行是至关重要的。本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来...

    mac mat jvm gc 内存分析

    通过调整JVM参数,例如设置堆大小、新生代与老年代的比例、GC策略等,可以有效地避免内存溢出和性能瓶颈。 在进行内存分析时,MAT的几个关键功能不容忽视: - Leak Suspects报告:MAT会自动分析heap dump,提供...

    JVM性能调优-JVM内存整理及GC回收.pdf

    本文将围绕JVM性能调优这一主题展开,重点探讨JVM内存管理机制、垃圾回收(GC)算法及其优化策略。 #### Java参数传递机制解析 首先,澄清Java中的参数传递机制是非常重要的,这有助于我们更好地理解对象在方法调用...

    jvm和gc详解及调优

    4. **垃圾收集机制**:GC是JVM自动管理内存的主要手段,涉及分代收集、标记-清除、复制、标记-整理等多种算法。书中会详细介绍各种算法的工作原理、优缺点,以及在不同场景下的选择。 5. **GC调优**:包括如何分析...

    jvm 参数及gc详解

    Java虚拟机(JVM)是Java程序运行的基础,它的配置参数和垃圾收集(GC)机制对于优化应用程序性能至关重要。本文将深入探讨JVM参数及其与Java垃圾收集相关的知识。 一、JVM参数详解 JVM参数可以分为三类:启动参数...

    JVM内存管理-GC模型-编写GC友好的代码.pdf

    ### JVM内存管理与GC模型详解 #### 一、引言 在现代软件开发中,Java虚拟机(JVM)作为一种广泛使用的平台,其内部机制尤其是内存管理和垃圾收集(GC)模型,对提升程序性能和稳定性至关重要。本文将深入探讨Sun ...

    JVM性能调优-JVM内存整理及GC回收

    《JVM性能调优-JVM内存整理及GC回收》是一份深入探讨Java虚拟机(JVM)优化的重要学习资料,特别适合对JAVA编程有经验的开发者。这份文档详细阐述了JVM性能调优的关键概念,包括JVM内存模型、垃圾回收(Garbage ...

    JVM内存日志

    - **堆内存**:这是JVM最大的内存区域,用于存储对象实例。堆内存分为新生代(Young Generation)、老年代(Tenured Generation)和持久代(Permanent Generation,Java 8后被元空间Metaspace替代)。 - **新生代*...

    jvm-full-gc调优-jvm-full-gc.zip

    5. **JVM参数调整**:通过设置JVM参数可以影响GC行为,如`-Xms`和`-Xmx`控制堆内存大小,`-XX:NewRatio`设置新生代与老年代的比例,`-XX:MaxPermSize`或`-XX:MetaspaceSize`控制方法区大小,`-XX:+...

    jvm学习笔记(jvm内存模型&垃圾收集算法&类加载机制)

    Java虚拟机(JVM)是Java程序的核心组成部分,它负责执行字节码并管理内存。在JVM的学习中,理解其内存模型、垃圾收集算法以及类加载机制至关重要。 1. **JVM内存模型** - **方法区**:也称为“永久代”,存储...

Global site tag (gtag.js) - Google Analytics