Java不需要程序员直接控制回收内存(不同于C和C++),其内存分配和回收都是由JRE在后台自动进行的。JRE提供一个后台线程进行检测和控制,一般在CPU空闲或内存不足时自动进行垃圾回收,自动释放不再被程序引用的对象,按照特定的垃圾回收算法。但程序员无法精确控制垃圾回收的时间和顺序等。
优点:提高编程效率;保护程序完整性。
缺点:开销影响性能。虚拟机必须跟踪程序中有用的对象,才能确定哪些是无用的对象。
特点:
1、垃圾回收只能回收内存资源,对其他物理资源,比如数据库连接,磁盘I/O等无能为力。
2、为了更快让垃圾回收,可以对无用对象引用变量设为null,暗示虚拟机可回收。
3、垃圾回收不可预知。可能定时/空闲/极限都有可能。可以System.gc方法建议回收,但仍有不确定性。除非finalize方法。
更新:16-3-22
建议回收:System.gc()或Runtime.getRuntime.gc()
通知系统进行垃圾回收,但系统是否进行垃圾回收依然不确定,但大部分时候,总会有一些效果,不会说程序的建议完全置之不理。
当系统要进行垃圾回收时,会调用默认的finalize()方法。但何时被调用时不确定的,不一定会执行。另外,任何类都可以重写finalize()方法,所以如果里面包含试图将可恢复对象重新变成可达状态的功能时会出现对象重新变成可达状态。
如果需要强制执行finalize()方法,在执行gc方法后,加上System.runFinalization()或Runtime.getRuntime.runFinalization()即可。
另外一些概念:
强引用:最常见,处于可达状态(包括常量池),不可能被回收。
软引用:SoftReference可能被回收。当系统内存足够时,不会被回收,只有当不足时才可能回收它。
弱引用:WeakReference不论内存是否足够,只要等到垃圾回收机制运行,总会被回收。
虚引用:类似于没有引用,不能单独使用,主要用于跟踪对象被垃圾回收的状态。