概述:
当JVM执行垃圾回收的时候,除了GC线程意外所有的线程都会处于等待状态,因此此时的程序处于停止状态(stop-the-world)。
因此System.gc()这个方法的调用会严重影响应用的性能,
按代的垃圾回收机制
- 在Java程序中不能显示地分配和注销内存,因此对象设置为null并不能显示清理内存。
- 绝大多数最新被创建的对象被分配到这里,
- 三个类型的内存:
- 新生代:绝大多数最新被创建的对象会被分配到这里,由于大部分对象在创建后会变得不可达,
- 老年代:在新生代存活下来的对象,然后被拷贝到这里。
- 永久代:老年代存活下来的对象。
![](https://img.haomeiwen.com/i1415519/a9e52f32d8b3cc55.png)
老年代:
- card table:老年代的对象指向新生代对象的引用都会被记录在这个表中。
新生代:
- 新生待的三个空间:
- 一个伊旬园空间(Eden)
- 两个幸存者空间(Survivor)
- 三个空间的特点:
1> 绝大多数刚刚被创建的对象会存放在伊旬园空间。
2> 在伊旬园空间执行了第一次GC之后,存活的对象被移动到其中一个幸存者空间。
3> 此后在伊旬园空间执行GC之后,存活的对象会被堆积在同一个幸存者空间。
4> 当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。之后会清空已经饱和的那个幸存者空间。
5> 以上步骤重复几次依然存活的对象,就会被移动到老年代。
网友评论