GC(Garbage Collection) 垃圾回收机制
什么是垃圾回收机制
垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用,以免造成内存泄露。
内存中已经不再被使用到的空间就是垃圾
c的垃圾回收是人工的,工作量大,但是可控性高。
java是自动化的,但是可控性很差,甚至有时会出现内存溢出的情况,
内存溢出也就是jvm分配的内存中对象过多,超出了最大可分配内存的大小。
System.gc()用于调用垃圾收集器,在调用时,垃圾收集器将运行以回收未使用的内存空间。它将尝试释放被丢弃对象占用的内存。
然而System.gc()调用只是声明,无法保证对垃圾收集器的调用。
所以System.gc()并不能说是完美主动进行了垃圾回收。
一 jvm怎么确定哪些对象应该进行回收
对象是否会被回收的两个经典算法:引用计数法,可达性分析算法。
引用计数法
JVM为每个对象维护一个引用计数,假设A对象引用计数为零说明没有任务对象引用A对象,那A对象就可以被回收了,但是引用计数有个缺点就是无法解决循环引用的问题。
可达性分析算法
为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。
GC Roots通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象是不可用的。
在Java中,可以作为GC Roots的对象包括下面几种:
* 虚拟机栈中引用的对象;
* 方法区中类静态属性引用的对象;
* 方法区中的常量引用的对象;
* 本地方法栈中JNI(即一般说的Native方法)的引用的对象;
总的来说就是当一个对象通过GC Roots搜索不到时,说明对象可以被回收了,但什么时候回收还要看GC的心情!
二在确定了哪些对象可以被回收之后,jvm会在什么时候进行回收
1会在cpu空闲的时候自动进行回收
2在堆内存存储满了之后
3主动调用System.gc()后尝试进行回收