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
最新文章
- docker中如何制作自己的基础镜像
- java web(三) Tomcat虚拟目录映射方式
- PowerShell调用jira rest api实现jira统计自动化
- MySQL Server 5.7解压版缺少文件无法启动
- 安卓虚拟机启动失败intel haxm未安装
- nyoj 56-阶乘因式分解(一)
- 常用应用层协议HTTP、RTSP、RTMP比较
- Redirect and POST in ASP.NET
- Linux巡检
- RegexOptions枚举
- 免费利用网页版谷歌翻译实现任意语言转换php版
- 【Vue】详解Vue组件系统
- WPF自学入门(三)WPF路由事件之内置路由事件
- java.text.DateFormat 多线程并发问题
- 解决stackoverflow打开慢的问题
- Linux内核第五节 20135332武西垚
- python logging模块,升级print调试到logging。
- map 小模板~~~ 写的不好 继续添加
- adb shell pm list packages的用法
- jquery-easyui:如何设置组件属性
热门文章
- Office2021简体中文离线安装包下载地址合集,目前最全
- hashMap的底层数据结构
- 解决用flex布局时内容溢出的问题
- appsettings.json用机密替换字符串-利用 VisualStudio 管理用户机密
- Linux常用命令 转于WoW_Boom
- Golang依赖管理工具: go module 详解
- 【CDH】cdh搭建遇到的坑和解决过程
- 【Shell】DBeaver Enterprise Edition 5.1.1 Download
- react -hook 项目搭建
- 【SSO单点系列】(4):CAS4.0 之非Ajax-iframe 登录