天天看点

java基础---垃圾回收机制

垃圾收集器(Garbage Collectors):

1.垃圾回收目的:识别并且丢弃应用不在使用的对象来释放和重用资源

2.垃圾回收分为三个区域:新生代(又分为伊甸园和存活区)、老年代、永久代。

垃圾回收流程:

步骤1.当对象要创建时,先查看伊甸园内存空间是否足够,足够则不进行回收,将对象存储在伊甸园中,内存不足则进行一次minor gc,然后再次判断伊甸园内存是否足够,足够就存储对象;

步骤2.如果伊甸园中内存还是不够存储要创建的对象,则查看存活区内存是否足够,足够就先将部分伊甸园活跃对象转移到存活区中,再将要创建的对象存储在伊甸园中;

步骤3.如果存活区内存不够,则查看老年代内存是否足够,足够就先将部分存活区活跃对象转移到老年代中,再将部分伊甸园活跃对象转移到存活区中,再将要创建的对象存储在伊甸园中;

步骤4.如果老年代内存不够,则进行一次full gc,然后再查看老年代内存是否足够,足够就先将部分存活区活跃对象转移到老年代中,再将部分伊甸园活跃对象转移到存活区中,再将要创建的对象存储在伊甸园中;

步骤5.如果老年代内存还是不够,则报错:OutOfMemoryError。

注意:gc虽然可以释放内存空间,但频繁的释放内存空间会影响系统性能,gc的次数越少,则系统越高效。

3.System.gc()和 Runtime.gc():提醒JVM进行垃圾回收,不够,立即开始还是延迟垃圾回收还是由JVM决定。

4.finalize()方法:在释放对象占用内存之前,垃圾收集器会调用对象的finalize()方法,一般建议在该方法中释放对象占用的资源。

5.对象被置null后,垃圾收集器是否会立即释放对象占用内存?

不会,不过在下一个垃圾回收周期,对象将是可被回收的

6.java的堆结构:运行时数据区,所有类的实例和数组都是在堆上分配内存,在JVM启动时被创建,对象所占的内存由垃圾收集器回收。堆内存是由存活和死亡的对象组成的,存活的对象是应用可以访问的,不会被垃圾回收,死亡的对象是应用不可访问且还没被回收的对象。在被回收之前,这些对象会一直占据堆内存空间。

7.对象什么时候被回收:当对象对当前使用这个对象的应用程序变得不可触及时,这个对象就可以被回收了。

8.永久代一般不会发生垃圾回收,除非永久代满了或者超过了临界值,会出发完全垃圾回收(full gc)。

继续阅读