Java中的垃圾回收

关于Java垃圾回收机制的几点:

1. What ?

Java中除了基本类型之外都是对象,基本类型分配的是堆栈内存,对象时通过new分配的堆内存。不同于C或C++,对象没有析构函数,Java是通过垃圾回收机制回收对象的内粗的。也就是当一个对象没有被其他对象或变量使用和引用的时候,该对象就属于无用的对象,在某种情况下,Java的垃圾回收机制就会回收这些无用的对象,以释放堆内存。


2. When ?

垃圾回收需要开销,所以Java虚拟机在内存充裕时有可能不会对无用的对象进行垃圾回收,也就是垃圾回收在程序运行的过程中没有进行。在系统濒临内存耗尽的情况下,垃圾回收通常会进行。如果在程序退出的时候垃圾回收还一直没有进行,那么随之程序的退出,分配在堆上的内存空间等资源会交付给操作系统。也就是说垃圾回收是需要开销的,垃圾回收只会在必要的时候进行,这种垃圾回收机制并不保证程序运行过程中进行。


3. How ?

垃圾回收是否在程序运行期间执行是通过Java虚拟机对当前系统内存的紧迫程度的判断决定的,如果想在程序运行的某个时刻希望执行垃圾回收,可以调用System.gc()。该代码的作用是告知Java虚拟机希望执行一次垃圾回收,但是并不保证该代码一定会让Java虚拟机进行垃圾回收。


4. finalize

在垃圾回收执行(如果Java虚拟机执行了垃圾回收)对某一个对象进行垃圾回收时,会调用该对象的finalize方法,该方法是基类Object的一个方法,可以在finalize方法中执行一些清理以及资源释放操作,比如在对象中通过调用C或C++通过malloc分配了内存,那么就可以在finalize中调用相应的free函数释放掉之前分配的内存。由此看来Java对象中的finalize方法有点类似于C++中的析构函数。最佳实践是除了内存以外,不能依赖垃圾回收器去做任何事,如果需要进行清理,最好是编写你自己的清理方法(比如编写名为dispose之类的方法),然后在确定要清理的时候手动调用该自定义的清理方法。

你可能感兴趣的:(Java中的垃圾回收)