JVM系列(四):GC策略
一、概念
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策略的更多相关文章
- JVM系列二:GC策略&内存申请、对象衰老
JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...
- 【转载】JVM系列二:GC策略&内存申请、对象衰老
JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...
- [转]JVM系列二:GC策略&内存申请、对象衰老
原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037056.html JVM里的GC(Garbage Collection)的算法有 ...
- jvm系列:Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...
- jvm系列(四):jvm知识点总结
原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...
- jvm系列四、jvm知识点总结
原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...
- JVM 分代GC策略分析
JVM 分代GC策略分析 我们以Sun HotSpot VM来进行分析,首先应该知道,如果我们没有指定任何GC策略的时候,JVM默认使用的GC策略.Java虚拟机是按照分代的方式来回收垃圾空间,我 ...
- jvm系列 (四) ---强、软、弱、虚引用
java引用 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 我的博客目录 为什么将引用分为不同的强度 因为我们需要实现这样一种情 ...
- java jvm内存管理/gc策略/参数设置
1. JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想 ...
- 【转】JVM 分代GC策略分析
我们以Sun HotSpot VM来进行分析,首先应该知道,如果我们没有指定任何GC策略的时候,JVM默认使用的GC策略.Java虚拟机是按照分代的方式来回收垃圾空间,我们应该知道,垃圾回收主要是针对 ...
随机推荐
- redis(13)持久化操作-AOF
AOF(Append Only File) 以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来 (读操作不记录), 只许追加文件但不可以改写文件,redis 启动之初 ...
- Apinto 网关 V0.11.1 版本发布,多协议互转,新增编码转换器,接入 Prometheus...
憋了那么久,Eolink 旗下 Apinto 开源网关再次更新啦~ 一起来看看是否有你期待的功能! 1.协议转换功能上线 之前发布的 Apinto v0.10.0 已经支持了多协议的基本功能,实现多协 ...
- 奇迹网站编辑保存的时候提示Access is denied
出现上面这个情况 只有在IIS模式下运行奇迹MU网站系统才会出现这个问题. 解决办法: 给网站目录赋予everyone权限 1.在网站目录右键属性 2在文件夹属性界面,点击"安全" ...
- javaSE学习二
使用Scanner实现用户交互 注意点:使用next方法时一定读取到有效字符后才能结束输入,有效字符前的空白自动去除,有效字符后的空白为结束符,next不能得到有空格的字符串. nextline方法以 ...
- vscode 开发c++
makefile.mk #makefile.mk 公共头文件 ifndef TARGET # /root/make/src/test_include # notdir TARGET:=$(notdir ...
- C++实现链队列相关操作代码
#include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100#define OK 1#d ...
- 解决多行文本超出显示省略号webpack打包后失效的问题
开发环境没问题: 但是在打包部署后就失效了: 经过对比后发现是因为: 缺少了 -webkit-box-orient: vertical; 导致 解决方案 : /* ! autoprefixer: o ...
- 关于head中代码被挤到body中的问题
可能是使用php引用文件时出现了问题,文件格式不是utf-8,将其放在head后面就好
- CH582m串口透传程序
目录 参考了沁恒官网22年1月更新的CH583EVT包中的UART1例程 功能:上位机通过串口1发送指令规定串口2和3的波特率,实现串口2和3之间的数据透传 担心串口3的接收中断会被串口2的发送中断打 ...
- nginx热更新流程记录
已经做过不止一次的nginx热更新了,之前都是按照别人的路子照葫芦画瓢,现在根据我在的项目单独写一个nginx热更新流程备份自用. nginx热升级流程上传新tar到/home/cp命令复制到/usr ...