一、概念

GC,Garbage Collection垃圾回收,主要针对JVM中的堆和方法区,而JVM栈、本地方法栈,程序计数器都是线程私有的,跟随线程生命周期。

二、对象存活判断

1. 引用计数:每个对象有个计数器,多一个引用加1,少一个减1,为0时回收

2. 对象可达性分析:到GC Roots没有任何引用链

三、垃圾回收算法种类,内存回收的方法论

1. 标记-清除算法,标记需要回收的对象,然后清除,会产生内存碎片

2. 复制算法,把内存分为两半,一半用来使用,当需要回收时,把存活的对象复制到另一半,限制了内存空间

3. 标记-整理算法,清除完之后移动碎片

4. 分代回收算法:年轻代使用复制算法,老年代使用标记-整理算法,综合上面几种算法

四、垃圾回收器,内存回收的具体实现

1. 串行收集器(serial collector):

最稳定,效率最高,但应用线程会产生较长停顿,年轻代和老年代都进行单线程串行回收

参数:-XX:+UseSerialGC

2. ParNew收集器:串行收集器的多线程版本,新生代并行,老年代串行

参数:-XX:+UseParNewGC

-XX:ParallelGCThreads 限制线程数量

3. 并行收集器(parallel collector):类似于ParNew收集器

参数:-XX:+UseParallelGC 老年代串行

4. Parallel Old收集器

参数:-XX:+UseParallelGC 老年代并行

5. CMS收集器Concurent Mark Sweep:

a. 以获取最短回收停顿时间为目标,与用户线程一起并发执行,基于标记-清除算法实现

b. 4个步骤:初始标记、并发标记、重新标记、并发清除

c. 参数:-XX:UseConcMarkSweepGC

d. 优缺点:优:并发收集耗时低,缺:产生碎片,并发阶段降低吞吐量

6. G1收集器,重点使用

最新的收集器,弱化新生代和老年代,空间整合(基于标记-整理算法)并可预测停顿

五、 内存申请过程

a. JVM会试图为相关Java对象在Eden中初始化一块内存区域

b. 当Eden空间足够,内存申请结束,否则进行下一步

c. JVM试图释放在Eden中所有不活跃的对象(minor collection),释放后若Eden空间仍然不足,则试图将部分Eden对象放入Survivor区

d. Survivor区被用来作为Eden及old的中间交换区域,当old区空间足够时,Survivor区的对象会被移到old区,否则会被留在Survivor区

e. 当old区空间不够时,JVM进行major collection

f. Full gc后,如果survivor和old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存,则“out of memory”

六、对象衰老过程

a. 衰老过程:Eden->Survivor Space->Old

b. GC触发条件:YGC:eden空间不足时, FGC:old空间不足,显式调用System.GC时

参考:

http://www.cnblogs.com/ityouknow/p/5614961.html

http://www.cnblogs.com/redcreen/archive/2011/05/04/2037056.html

JVM系列(四):GC策略的更多相关文章

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

    JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...

  2. 【转载】JVM系列二:GC策略&内存申请、对象衰老

    JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...

  3. [转]JVM系列二:GC策略&内存申请、对象衰老

    原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037056.html JVM里的GC(Garbage Collection)的算法有 ...

  4. jvm系列:Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  5. jvm系列(四):jvm知识点总结

    原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...

  6. jvm系列四、jvm知识点总结

    原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...

  7. JVM 分代GC策略分析

    JVM 分代GC策略分析   我们以Sun HotSpot VM来进行分析,首先应该知道,如果我们没有指定任何GC策略的时候,JVM默认使用的GC策略.Java虚拟机是按照分代的方式来回收垃圾空间,我 ...

  8. jvm系列 (四) ---强、软、弱、虚引用

    java引用 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 我的博客目录 为什么将引用分为不同的强度 因为我们需要实现这样一种情 ...

  9. java jvm内存管理/gc策略/参数设置

    1. JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想 ...

  10. 【转】JVM 分代GC策略分析

    我们以Sun HotSpot VM来进行分析,首先应该知道,如果我们没有指定任何GC策略的时候,JVM默认使用的GC策略.Java虚拟机是按照分代的方式来回收垃圾空间,我们应该知道,垃圾回收主要是针对 ...

随机推荐

  1. C#神器"BlockingCollection"类实现C#神仙操作

    前言 如果你想玩转C# 里面多线程,工厂模式,生产者/消费者,队列等高级操作,就可以和我一起探索这个强大的线程安全提供阻塞和限制功能的C#神器类 BlockingCollection简单介绍 微软介绍 ...

  2. 简单介绍Python中如何给字典设置默认值

    这篇文章主要介绍了Python中如何给字典设置默认值问题,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 Python字典设置默认值 我们都知道,在 Python 的字 ...

  3. CF1738E Balance Addicts

    个人思路: \(sum_i\) 表示前 \(i\) 个数的前缀和,推一下式子可知是要选若干对 \(l_i,r_i\),使得 \(l_1 < l_2 <\dots < l_k \le ...

  4. Stanford NLP 在Python环境中安装、介绍及使用

    Stanford NLP Stanford NLP提供了一系列自然语言分析工具.它能够给出基本的词形,词性,不管是公司名还是人名等,格式化的日期,时间,量词,并且能够标记句子的结构,语法形式和字词依赖 ...

  5. Android 添加shape, selector等资源文件

    右键点击drawable文件夹,选择new -> Drawable Resource file 在弹出的New Resource file界面中,将Root element定义为shape,就可 ...

  6. 十二、21.提交本地代码到Git仓库并推送到码云

    查看分支 运行git add . 把所有修改过后文件添加到暂存区 git commit 把当前所有的代码提交到rights分支 加-m加一个消息 到此所有的功能模块都已经提交到了rights这个分支里 ...

  7. Qt控件installEventFilter后不显示了

    原因是在eventFilter函数内return true了,就不会在执行paint事件了,将return true改为return false即可.

  8. mathjs 数字处理

    // mathjs 四舍五入取整 val:值export function roundingInt(val) { if (val) { return math.round(val, 0) }}// m ...

  9. 使用 PSAPI 库枚举进程 EnumProcesses()函数

    使用 PSAPI 库枚举进程 在 Windows NT 中,创建进程列表使用 PSAPI 函数,这些函数在 PSAPI.DLL 中.这个文件是随 Platform SDK 一起分发的: 使用这个库所需 ...

  10. Power shell 读取电量,改变屏幕亮度

    1. Get-Wmiobject  -List win32*  # 列出所有win32_信息(基本的BIOS,Battery , Memory, processor) 2.Get-WmiObject ...