介绍
自动内存管理也就是俗称的垃圾收集(garbage-collection),可以让程序员减轻许多负担,也减少程序员犯错的机会,所以相当受欢迎。
在Java中,你不需要主动删除对象,而是由Java虚拟机代劳。Java虚拟机会“持续追踪”每个对象被使用的情形,如果某对象未被用到,Java虚拟机就会自动将其释放。而要如何“持续追踪”,具体实现细节留给Java虚拟机的实现者发挥。
在早期,许多虚拟机只是将垃圾收集实现成一个线程,一再进行检查,遇到垃圾就释放其内存。因为垃圾收集应该尽量不要影响到原程序的执行,所以虚拟机将此线程的优先权设为0(最低)。如此一来,当系统有其他线程在运作时,就不会进行垃圾收集,所以常常很久才会收集到垃圾,造成内存不足。但又不能因此调高其优先权,否则对Java的执行效率是一大打击。
也许人们奇怪Java为什么不能同时支持自动内存管理和手动内存管理,主要是因为Java语言的主要精神之一是robust,如果Java同时支持这两种内存管理的话,可能会造成程序中有许多潜在的bug,内存不当存取的问题会比C/C++更严重,所以是不可能这么做的。
使用
对象空间的分配:使用new关键字创建对象即可
对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有“不可达”对象的内存空间。
要点
1、程序员无权调用垃圾回收器。(因为Java是写一些大型软件,服务器软件,为了降低出错概率而不像C++那样可以被调用),但是可以提建议,程序员可以通过System.gc()通知GC运行,但是Java规范并不能保证立刻运行。
JVM实现者可以通过System.gc()调用来决定JVM的行为。一般来说,我们在编写Java代码并将其留给JVM时,不需要考虑内存管理。
2、Finalize()方法,是Java提供给程序员用来释放对象或资源的方法,但是尽量少用。一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收器发生时,才会真正回收对象占用的内存。
之所以真正地释放掉对象或资源需要垃圾回收器发生两次是因为如果一个对象覆盖了 finalize() 方法,那么在真正被释放掉之前,至少需要经过两次标记。第一次被标记的时候会被放在 一个 F-Queue 队列中,finalize() 方法是对象被真正释放掉的最后一个步骤。在第二次标记的时候,如果该对象成功与引用链(GC-Roots)上的任何一个对象关联,那么它仍然不会被释放,否则将会被垃圾收集器回收。