`

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

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

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

       young generationeden2survivor 区域组成。其中一个survivor区域一直是空的,是eden区域和另一个survivor区域在下一次copy collection后活着的objecy的目的地。objectsurvivo区域被复制直到转移到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区被用来作为Edenold的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
  5. old区空间不够时,JVM会在old区进行major collection
  6. 完全垃圾收集后,若Survivorold区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory错误"

二、对象衰老过程

  1. 创建的对象的内存都分配自edenMinor 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中所有存活的对象copyto 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)

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

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

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

是否压缩需要看配置的具体GC

jstat –gcutil
gc log

  1. permanent generation空间不足会引发Full GC,仍然不够会引发PermGen Space错误。

 

分享到:
评论

相关推荐

    深入理解JVM&G1GC

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

    JVM常用的GC策略介绍

    描述了JVM的常用GC算法、GC策略和常用的垃圾回收器,适用于JDK1.7。

    jvm工具、参数调优&调试技巧

    jvm工具、参数调优&调试技巧 jvm工具、参数调优&调试技巧

    深入理解JVM&G1; GC

    深入理解JVM &G1; GC内部结构,年轻代,老年代,元空间等分布情况

    Jvm1.8_GC.mmap

    GC:Gabage Collection,指JVM堆内存区域的垃圾回收 Minor GC:年轻代垃圾回收,所有的Majar GC都会触发进程暂停,只是这个实际很短 Major GC:也叫Full GC,年老代垃圾回收 年轻代和年老代的GC策略是不...

    深入理解JVM & G1 GC.rar

    G1 GC提出了不确定性Region,每个空闲Region不是为某个固定年代准备的,它是灵活的,需求驱动的,所以G1 GC代表了先进性。本书主要为学习Java语言的学生、初级程序员提供GC的使用参考建议及经验,着重介绍了G1 GC ...

    深入理解JVM & G1 GC

    深入jvm垃圾回收 调优细节。

    JVM&g1gc;带书签,完整版本

    最新的G1学习资料,JVM&g1gc;带书签,完整版本,好书。

    JVM与GC调优课程视频

    JVM与GC调优课程视频 〖课程介绍〗: JVM与GC调优课程视频 〖课程目录〗: 1.笔记/ ├── 第1篇-字节码篇.png?x-oss-process=style/pnp8 ├── 第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├── 第3篇-运行时...

    JVM GC原理深入学习.pdf

    同时,为了能更深入理解与之相关的知识点,本文特地编写了“第二章 基础知识”,详细的讲解与GC学习相关的JVM架构、JVM选项、Object内存布局、指针压缩等内容,以便读者能更加清晰的理解GC原理的底层逻辑。

    jvm工具、参数调优&调试技巧.doc

    jvm工具、参数调优&调试技巧

    JVM_GC调优

    JVM_GC调优

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

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

    JVM内存空间分配笔记

    主要是JVM内存分配及简单的JVM性能调优

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

    JVM堆相关知识 为什么先说JVM堆? JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在...这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来负责这个无用的对象(地球人都知道)。

    jvm 参数及gc详解

    jvm配置参数详解,以及Java gc详解

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

    JVM性能调优

    jvmgc过程介绍

    jvmgc过程介绍(jpg)

    Jvm对象内存分配理解

    内存分配是 Jvm 对象内存分配的第二步。在类加载完成后,Jvm 会为对象分配内存。对象所需内存大小在类加载完成后便可完全确定。Jvm 使用两种方法来分配内存:指针碰撞和空闲列表。 指针碰撞 指针碰撞是一种简单的...

    JVM内存管理_GC模型_编写GC友好的代码

    JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧

Global site tag (gtag.js) - Google Analytics