Java垃圾回收机制(gc)
在程序运行过程中,每创建一个对象都会被分配一定的内存用以存储对象数据。如果一味的去占用内存而不释放,则会遇到内存溢出的问题。
在程序运行的过程中,gc会用引用计数法去统计对象被多少其他对象持有,如果对象已经没有被引用,那么该对象转变为
可复活状态
(对于gc线程来说对象有三种状态:
1. 可触及状态:程序中还有变量引用,那么此对象为可触及状态。
2. 可复活状态:当程序中已经没有变量引用这个对象,那么此对象由可触及状态转为可复活状态。CG线程将在一定的时间准备调用此对象的finalize方法(finalize方法继承或重写自Object),finalize方法内的代码有可能将对象转为可触及状态,否则对象转化为不可触及状态。
3. 不可触及状态:只有当对象处于不可触及状态时,GC线程才能回收此对象的内存。
)
GC为了能够正确释放对象,必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行
监控,所以无论一个对象处于上文中的任何状态GC都会知道。
GC线程会在一定的时间执行可复活状态对象的finalize方法,那么何时执行呢?由于不同的JVM实现者可能使用不同的
算法管理GC,所以在任何时候,开发者无法预料GC线程进行各项操作(包括检测对象状态、释放对象内存、调用对象的finalize方法)的时机。虽然可以通过
System.gc()和
Runtime.getRuntime().gc()函数提醒GC线程尽快进行垃圾回收操作,但是这也无法保证GC线程马上就会进行相应的回收操作。
Java中垃圾收集器自动地定期扫描Java对象的动态内存,并将所有的引用对象加上标记,在对象运行结束后(无引用变量对该对象进行关联),清除其标记,并将所有无标记的对象作为垃圾进行回收,释放垃圾对象所占的内存空间。
对于占用空间比较大的对象(比如大数组),推荐在确认不再使用的时候将其值为null,jvm在回收大对象的时候不如小对象来的及时,
置为null就能强制在下次GC的时候回收掉他。