经典的一句话:C++程序员觉得内存管理太重要了,所以一定要自己进行管理;C#,Java程序员觉得内存管理太重要了,所以一定不能自己去管理。
某些语言,比如C语言,要求程序员显式的分配内存、释放内存。程序按需分配内存,不需要的时候将内存释放。但是这种做法容易引起内存泄露:即由于某种
原因未能将分配的内存释放,如果这个过程循环往复的出现,那么就很有可能耗尽内存,导致程序非正常退出,至少会使得程序速度变慢。相比之下,Java并不要求
程序员显式的管理内存,Java会自动为对象分配内存空间,并且在该对象不再引用时释放内存。
Java使用内存垃圾收集器的技术监督Java程序的运行,当对象不再被使用的时候,自动释放对象对应的内存空间。Java使用一系列软指针来跟踪对象的各个引用,
并使用对象表将这些软指针映射为对象的引用。之所以称之为软指针,是指针并非直接指向对象,而是指向了对象的引用。Java的垃圾收集器能够以单独的线程在后台
运行,并依次检查每个对象。通过更改对象表项,可以标记、移除、或者检查对象。垃圾收集器是自动运行的,一般没有显式的垃圾收集器,虽然System.gc()可以
运行垃圾收集器,但是这并不能保证立即收回指定对象。gc()方法面向所有的对象,任何程序都不可以指导垃圾收集器怎么做,做什么,什么时候做。Java提供了默
认的机制来终止对象释放资源,就是finalize(),在finalize()返回后,对象消失,垃圾收集器开始工作。
1、JVM的垃圾收集器并不能防止程序内存溢出。
2、当一个对象的所有引用被置空时,对象的空间可以被垃圾收集器收回。
3、一个对象被赋予NULL,然后再也不被使用了,对象空间被收回。
4、给对象赋予了新的值,即分配了新的空间,此时旧的空间被收回。
可以使用有向图来表示当前JVM的内存管理状态,当某些对象不可达的时候,对象空间将被释放>>参考《Java面试宝典第三版》P88~P89.
原文地址:http://www.cnblogs.com/tju-gsp/p/3710418.html