java basic-GC

Posted 鑫男

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java basic-GC相关的知识,希望对你有一定的参考价值。

一  JVM把堆分为很多区,如下图

 

新生代:新创建的对象都是用新生代分配内存,Eden空间不足时,触发Minor GC,此时会把存活的对象转义进Survivor区。

老年代:用于存放经过多次Minor GC之后依然存活的对象,至于多少次呢 (HotSpot虚拟机默认15次,用-XX:MaxTenuringThreshold控制,大于该值进入老年代,但这只是个最大值,并不代表一定是这个值)

 

新生代的GC(Minor GC): 新生代通常存活时间短,使用copying算法回收,将Eden和Survivor1(FromSpace)存活的对象复制到Survivor2(ToSpace),然后直接清理掉Eden和Survivor1的空间。

下一次Minor GC 则把Eden和Survivor2存活的对象复制到 Survivor1,然后直接清理Eden和Survivor2,以此轮流,Survivor两块内存中总有一个是空白的。

使用空闲指针方式来控制GC,指针保存最后一个分配的对象在新生代区间的位置,当新对象要分配内存时,用于检查空间是否足够。连续分配对象时,对象逐渐从Eden到Survivor再到老年代。

 

老年代的GC(Major GC/Full GC):老年代对象存活时间长,比较稳定,因此采用标记(Mark)算法进行回收,所谓标记算法就是扫描出存活的对象,再回收未被标记的对象。

回收后空间要吗合并,要吗标记出来下次分配,减少内存碎片带来的效率损耗。

 

永久代:存放Java中的类和加载类的类加载器本身。

 

二  GC的触发时间

1 程序空闲的时候

2 手动 system.gc()

3 java堆内存不够用的时候,会触发,第一次触发GC后内存依然不够用,会第二次触发,如果还不够用,就out of memory

 

三 GC回收什么东西

1  引用计数为空的对象

2 从GC Root开始搜索,且搜索不到的对象

  跟搜索算法:以一系列名为 GC Root的对象作为起点,从这些节点开始往下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链的时候,则就证明此对象是不可用的。

3 从root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象

 

四  GC做什么

总的来说是删除不使用的对象,腾出内存空间。

 

五 容易发生内存泄漏的情况

1 静态集合类像HashMap、Vector等,特别是如果集合里存了集合或者存了对象而且该对象内有集合。

2 各种连接,数据库连接,网络连接,IO连接等没有显示调用close关闭,不被GC回收导致内存泄露。

3 监听器的使用,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。

 

以上是关于java basic-GC的主要内容,如果未能解决你的问题,请参考以下文章

Java 布尔运算

java [Java] Java常用代码#java

Java - 35 Java 实例

Java While 循环

Java 字符串

Java If ... Else