Java内存回收
2016-07-17 21:52
246 查看
判断对象是否已死
判断算法
引用计数法可达性分析算法
Java的四种引用
强引用软引用(还有用但并非必需,二次回收的目标)
弱引用(非必需对象,垃圾回收目标)
虚引用(垃圾回收时收到系统通知)
finalize方法作用
对象被第一次标记时,系统判断其是否需要执行finalize方法,如果对象没有实现finalize方法,或者finalize方法已经执行过,则系统判断为不需要执行。如果需要执行finalize方法,则开始执行,第二次标记和筛选时判断对象是否成功拯救自己,如果成功拯救,则将其在回收集合中移除,否则进行回收。
垃圾回收算法
标记-清除算法复制算法
Eden区 8
Survivor区 1
标记-整理算法
分代收集算法
垃圾收集器
ParNew参数-XX:SurvivorRatio(Eden:Survivor)
-XX:PretenureSizeThreshold 直接晋升老年代的大小
-XX:HandlePromotionFailure 是否允许担保失败
-XX:+UseConcMarkSweepGC(默认使用ParNew)
-XX:+UseParNewGC(强制指定)
Parallel Savenge参数
-XX:GCTimeRatio 设置吞吐量大小
-XX:MaxGCPauseMillis 设置停顿时间
-XX:+UseAdaptiveSizeolicy GC自适应调节策略
CMS回收过程
初始标记->并发标记->重新标记->并发清除
G1回收过程
初始标记->并发标记->最终标记->筛选回收
垃圾回收器参数总结
UseXXXGC(使用XXX回收算法)
SurvivorRatio
MaxTenuringThreshold:晋升老年代的年龄
垃圾回收器 | 工作地点 | 线程数 | 使用算法 | 特点 |
---|---|---|---|---|
Serial | 新生代 | 单线程 | 复制 | 简单高效,stop the worle |
ParNew | 新生代 | 多线程 | 复制 | Serial的多线程版本 |
Parallel Savenge | 新生代 | 多线程 | 复制算法 | 关注吞吐量 |
Serial Old | 老年代 | 单线程 | 标记-整理 | |
Parallel Old | 老年代 | 多线程 | 标记-整理 | 吞吐量优先 |
CMS | 老年代 | 标记-清除 | 多线程 | 缩短回收停顿,产生空间碎片 |
G1 | 整体:标记-整理,局部:复制 | 多线程 | 面向服务器 |
内存分配与回收策略
对象优先在Eden区分配空间不够则发起Minor GC
大对象直接进入老年代
长期存活的对象将进入老年代
动态对象年龄判定
如果在Survivor空间中相同年龄所有对象的大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。
空间分配担保
相关文章推荐
- Java 6 JVM参数选项大全(中文版)
- 深入解析JVM对dll文件和对类的装载过程
- JVM Tomcat性能实战(推荐)
- Java虚拟机JVM性能优化(二):编译器
- Java程序员必须知道的5个JVM命令行标志
- Java虚拟机JVM性能优化(三):垃圾收集详解
- 简单谈谈JVM、JRE和JDK的区别与联系
- 解析Java虚拟机中类的初始化及加载器的父委托机制
- JAVA中JVM的重排序详细介绍
- 浅谈Java的虚拟机结构以及虚拟机内存的优化
- JVM角度调试优化MyEclipse
- Java虚拟机JVM性能优化(一):JVM知识总结
- Android Studio 报错failed to create jvm error code -4的解决方法
- 解析Linux系统中JVM内存2GB上限的详解
- 了解Java虚拟机JVM的基本结构及JVM的内存溢出方式
- Java堆空间占满的gc日志实例
- JVM调优之Tomcat启动参数配置及详解(一)
- java动态代理模式
- 一次FULL GC问题的排查
- Groovy Meta Object Protocol