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篇

转载于:https://www.cnblogs.com/redcreen/archive/2011/05/04/2037056.html

JVM系列二:GC策略内存申请、对象衰老相关推荐

  1. jvm系列二:Java8内存模型-永久代(PermGen)和元空间(Metaspace)

    原文地址:https://www.cnblogs.com/paddix/p/5309550.html 一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地 ...

  2. Jvm 系列(三):GC 算法 垃圾收集器

    这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理. 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 ...

  3. jvm系列(三):GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...

  4. jvm gc策略_IBM JVM调整– gencon GC策略

    jvm gc策略 本文将向您详细介绍从Java虚拟机(例如HotSpot或JRockit)迁移到IBM JVM时重要的Java堆空间调整注意事项. 此调整建议基于我为我的一个IT客户端执行的最新故障排 ...

  5. IBM JVM调整– gencon GC策略

    本文将向您详细介绍从Java虚拟机(例如HotSpot或JRockit)迁移到IBM JVM时重要的Java堆空间调整注意事项. 该调整建议基于我为我的一个IT客户端执行的最新故障排除和调整任务. I ...

  6. JVM 系列(二) --- JVM 类加载的基本流程

    JVM 类加载 1 JVM 类加载概述 2类加载的基本流程 2.1 加载(Loading) 2.2 验证(Verification) 2.3 准备(Preparation) 2.4 解析(Resolu ...

  7. Jvm 系列(二):Jvm 内存结构

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...

  8. jvm系列(二):JVM内存结构

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...

  9. jvm系列二之GC收集器

    目录 参考 概念理解 并发和并行 吞吐量 GC垃圾收集器 Serial New收集器 Parallel New(并行)收集器 Parallel Scavenge(并行)收集器 Serial Old(串 ...

最新文章

  1. Google、Intel、Uber等巨头如何布局AI?听听他们自己人怎么说
  2. post传值php取不到数据,post请求中的参数形式和form-data提交数据时取不到的问题...
  3. mysql 修改配置生效_linux下面MySQL变量修改及生效
  4. 为何Apache下.htaccess不起作用,Linux、Windows详解
  5. mysql导出document_Mysql导入导出
  6. 内存管理:_CrtDumpMemoryLeaks和_CrtSetBreakAlloc
  7. sklearn svm如何选择核函数_机器学习之支持向量机多种核模型对比
  8. UVA 10588—— Queuing at the doctors
  9. HTTP协议详解(文档)
  10. django用sqlite跟mysql_django框架学习:九. django连接mysql,sqlite
  11. Java 读取某个目录下所有文件、文件夹
  12. css3滚动倾斜,jQuery 3D倾斜滚动页面效果
  13. Java NIO之DatagramChannel
  14. shiro框架实现权限管理
  15. php+检测是否是手机浏览器,php 判断是否是手机浏览器访问?
  16. itest考试系统破解 解决复制粘贴限制
  17. linux+qq+输入法下载官网,续:Linux下安装输入法和QQ软件
  18. 清华EMBA课程系列思考之十四 -- 战略管理
  19. 按下鼠标滚轮c语言,C++检测鼠标某键是否按下
  20. STM32填坑:时钟使能必须在外设初始化之前

热门文章

  1. VTK:PolyData之ColorCells
  2. Qt Creator连接设备
  3. C语言实现djikstra算法(附完整源码)
  4. 经典C语言程序100例之九六
  5. C++ Stacks(堆栈)
  6. android中setdate不是静态,为什么当setData()和setType()不起作用时,android intent的setDataAndType()工作正常?...
  7. Eclipse和MyEclipse相关的快捷键
  8. Mysql 8主从复制配置图解
  9. html输入密码自动隐藏,原生js实现密码输入框值的显示隐藏
  10. faster rcnn windows 下c++版本