百战程序员分享:Java中GC回收机制

在当前的Java虚拟机中使用引用计数法来进行对象管理几乎已经看不到了,如果是在学Java垃圾回收的话,把基本的GC回收机制学会就可以了。因为垃圾回收机制,属于内存管理的范畴。在上一次回答中,笔者对Java中堆与栈的理解进行了讨论,而垃圾回收的最终效果是为了增加对的可用性,将堆中多余的对象删除。finalize()方法在垃圾回收机制中占有重要的作用。在学的过程中需格外注意。

初始化对程序员来说是经常遇到的事情,但常常会忘记同样也重要的清理工作,下面介绍下Java中垃圾回收机制和其中finalize()方法的用途何在?Java垃圾回收本质上可以说是Java自动内存管理。垃圾回收的目的是为程序保持尽可能多的可用堆。虚拟机会删除不再需要从堆引用的对象。

Java的垃圾回收是由JVM自动进行,不是程序员可以控制的。

百战程序员分享:Java中GC回收机制

关于回收有几个方法:System.gc(); Sysytem.getRuntime().gc();但调用这两个方法并不能立刻进行垃圾回收。

GC回收的过程在 Java的存在周期是自动的,不需要分配和释放内存,同时也避免了内存泄漏。可以调用 System.gc()方法建议 JVM 执行垃圾收集以使得可被释放的内存能立即被使用,当此方法返回的时候,JVM 已经做了最大的努力从被丢弃的对象上回收内存空间。尚学堂•百战程序员提示:调用 System.gc()方法不能保证 JVM 立即进行垃圾收集,只是施加一个影响,因为垃圾收集线程的优先级很低(通常是最低的)。JVM 垃圾收集器收集一个对象之前,一般要求程序调用适当的方法释放资源,但在没有明确释放资 源的情况下,Java 提供了缺省机制来终止化该对象心释放资源,这个方法就是 finalize( )。

垃圾回收通常有两种情况:1.堆可用内存不足;2.CPU空闲。那么垃圾回收的最佳做法就是用编程的方式,我们可以手动让JVM通过调用System.gc()方法来运行垃圾回收。在内存占满时,且堆上没有对象可用于垃圾回收时,JVM可能会抛出OutOfMemoryException。对象在被垃圾回收从堆上删除之前,会运行finalize()方法。不建议用finalize()方法写任何代码。

finalize()方法一般有什么用途呢?GC回收器只知道释放那些经new分配的内存,所以它不知道该如何释放该对象的这块"特殊"内存,针对这一情况,Java允许在类中定义一个名为finalize()的方法,其工作原理为:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。


分享到:


相關文章: