java GC机制的一些总结
2016-04-28 12:05
246 查看
主要从三个方面考虑GC机制
1,哪些内存需要回收
2,什么时候回收
3,如何回收
1,哪些内存需要回收(可达性分析)
java虚拟机通过可达性分析算法知道一个对象是否需要被回收,可达性分析算法的简要介绍就是:选择一系列对象作为GC Roots,从这些对象向下搜索,他所经过的路径就是一个引用链,如果某些对象和GC Roots没有任何的连接的时候,就判定这些对象是无法存活的了,需要被清理掉!
如同上图,对象4和对象5,对象6就是即将被清除的对象
在这里也有一个问题,在进行可达性分析的时候,要求对象之间的关系处于一个静止的状态,不会出现动态的变化,否则无法进行下一步,java官方称之为stop the world,为了解决这个问题就引入了一个安全点的概念,jvm会设置一个安全点的标记,之后每个程序都会去轮询这个标记,发现中断标志就挂起等待。stop the world是无法避免的,无论使用哪种垃圾收集器
2,什么时候回收以及怎样回收
jvm中把堆中的对象分成新生代和老年代,首先对象优先分配在新生代中,因为新生代中的对象大多是朝生夕死的,生存周期很短,所以采用的是标记-复制的方式回收内存的,新生代区域中,分为一块较大的eden区域和两块较小的survive区域(记为survive1和survive2),每次将还存活的对象从survive1和eden区域中复制到survive2区域,之后清除survive1和eden区域中的内存,此时存活的内存就进入了survive2中,
(1)他们被赋予了一个年龄,每进行一次新生代清理他们就会增加1岁,虚拟机本身会设置一个年龄分界的默认值,超过这个默认值的时候就会进入到老年代中
(2)还有另外的一种情况就是同意年龄的survive2中的对象的内存超过了surivive2内存的一半,这些对象也会自动的进入老年代中
(3)大对象直接进入老年代,比如说一些长的字符串和数组
(4)还有一种就是空间担保的方式,因为老年代是不知道survive2中的对象的大小的,所以让survive中的对象进入到老年代是有风险的,因为老年代中的内存可能是不够的,这时候老年代就会把之前进入的那些对象的大小的平局值作为一个经验来判断是否要进行一次老年代的垃圾回收,如果远远大于经验值,就会导致担保失败,进行一次老年代的垃圾回收
老年代中由于内存回收的效率比较低,所以不经常进行内存的回收,使用的是标记整理的算法
1,哪些内存需要回收
2,什么时候回收
3,如何回收
1,哪些内存需要回收(可达性分析)
java虚拟机通过可达性分析算法知道一个对象是否需要被回收,可达性分析算法的简要介绍就是:选择一系列对象作为GC Roots,从这些对象向下搜索,他所经过的路径就是一个引用链,如果某些对象和GC Roots没有任何的连接的时候,就判定这些对象是无法存活的了,需要被清理掉!
如同上图,对象4和对象5,对象6就是即将被清除的对象
在这里也有一个问题,在进行可达性分析的时候,要求对象之间的关系处于一个静止的状态,不会出现动态的变化,否则无法进行下一步,java官方称之为stop the world,为了解决这个问题就引入了一个安全点的概念,jvm会设置一个安全点的标记,之后每个程序都会去轮询这个标记,发现中断标志就挂起等待。stop the world是无法避免的,无论使用哪种垃圾收集器
2,什么时候回收以及怎样回收
jvm中把堆中的对象分成新生代和老年代,首先对象优先分配在新生代中,因为新生代中的对象大多是朝生夕死的,生存周期很短,所以采用的是标记-复制的方式回收内存的,新生代区域中,分为一块较大的eden区域和两块较小的survive区域(记为survive1和survive2),每次将还存活的对象从survive1和eden区域中复制到survive2区域,之后清除survive1和eden区域中的内存,此时存活的内存就进入了survive2中,
(1)他们被赋予了一个年龄,每进行一次新生代清理他们就会增加1岁,虚拟机本身会设置一个年龄分界的默认值,超过这个默认值的时候就会进入到老年代中
(2)还有另外的一种情况就是同意年龄的survive2中的对象的内存超过了surivive2内存的一半,这些对象也会自动的进入老年代中
(3)大对象直接进入老年代,比如说一些长的字符串和数组
(4)还有一种就是空间担保的方式,因为老年代是不知道survive2中的对象的大小的,所以让survive中的对象进入到老年代是有风险的,因为老年代中的内存可能是不够的,这时候老年代就会把之前进入的那些对象的大小的平局值作为一个经验来判断是否要进行一次老年代的垃圾回收,如果远远大于经验值,就会导致担保失败,进行一次老年代的垃圾回收
老年代中由于内存回收的效率比较低,所以不经常进行内存的回收,使用的是标记整理的算法
相关文章推荐
- Java报文或者同步的数据有个别乱码情况的处理.
- eclipse远程连接hbase错误
- RxJava----操作符:组合操作符
- 【java】获取一年里某季、某月、某周的第一天及最后一天时间(日期工具类)
- Myeclipse10运行web程序时报java.lang.OutOfMemoryError: PermGen space时比较
- Java设计模式详解之门面模式(外观模式)
- java短信接口
- 从java到初学javaweb,所遇问题
- 利用Java自带的Base64加密,解密
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
- Java入门 第二季第四章 多态
- java设计模式中工厂模式
- java实现邮件上
- Java基础——Set接口
- struts2.3.28升级
- [javase]通过异常处理错误
- 火狐浏览器造成 spring3 MVC action的方法会执行两次
- java分页之假分页实现简单的分页器
- ZeroMQ(java)中监控Socket
- Java 标签 看了这个想不理解都难