黑马程序员 自动垃圾回收

来源:互联网 发布:linux如何删除文件夹 编辑:程序博客网 时间:2024/04/27 13:57

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

自动垃圾回收


首先,自动垃圾回收,意思是对一些开辟空间创建的数据,在不需要的时候系统自动清楚释放空间的一种机制。没有垃圾回收机制的情况下,是需要程序员手动进行内存管理的,例如C++语言,C++编译器不支持垃圾收集机制。通常使用C++编程的时候,程序员于程序中初始化对象时,会在主机存储器堆栈上分配一块存储器与地址,当不需要此对象时,进行解构或者删除的时候再释放分配的存储器地址。如果对象是在堆栈上分配的,而程序员又忘记进行删除,那么就会造成存储器泄漏。长此以往,程序运行的时候可能会生成很多不清除的垃圾,浪费了不必要的存储器空间。而且如果同一存储器地址被删除两次的话,程序会变得不稳定,甚至崩溃。因此有经验的C++程序员都会在删除之后将指针重置为0,然后在删除之前先判断指针是否为0。
C++中也可以使用“智能指针”(Smart Pointer)或者使用C++托管扩展编译器的方法来实现自动化存储器释放,智能指针可以在标准类库中找到,而C++托管扩展被微软的Visual C++ 7.0及以上版本所支持。智能指针的优点是不需引入缓慢的垃圾收集机制,而且可以不考虑线程安全的问题,但是缺点是如果不善使用智能指针的话,性能有可能不如垃圾收集机制,而且不断地分配和释放存储器可能造成存储器碎片,需要手动对堆进行压缩。除此之外,由于智能指针是一个基于模板的功能,所以没有经验的程序员在需要使用多态特性进行自动清理时也可能束手无策。
Java语言则不同,上述的情况被自动垃圾收集功能自动处理。对象的创建和放置都是在存储器堆栈上面进行的。当一个对象没有任何引用的时候,Java的自动垃圾收集机制就发挥作用,自动删除这个对象所占用的空间,释放存储器以避免存储器泄漏。
注意程序员不需要修改finalize方法,自动垃圾收集也会发生作用。但是存储器泄漏并不是就此避免了,当程序员疏忽大意地忘记解除一个对象不应该有的参考的时候,存储器泄漏仍然不可避免,例如以下的程序:

// ...String str = "这是一段字串";System.out.println(str);for(int i){System.out.println("Hello World"+i);}// ...
在循环开始之前,字符串str已经不会再用到了,但未将这个参考指向null,因此字符串str无法被gc所回收。这种存储器泄漏必须等到一个函数退出之后才会被系统取回,只不过发生的机率要比不激活垃圾收集机制的C++程序少很多。但是总体来讲,自动垃圾收集机制要安全和简单许多。
不同厂商、不同版本的JVM中的存储器垃圾回收机制并不完全一样,通常越新版本的存储器回收机制越快,IBM、BEA、SUN等等开发JVM的公司都曾宣称过自己制造出了世界上最快的JVM[来源请求],JVM性能的世界纪录也在不断的被打破并提高。
IBM有一篇有关Java存储器回收机制比不激活垃圾收集机制的C++存储器处理快数倍的技术文章,而著名的Java技术书籍《Java编程思想》也有一段论述Java存储器及性能达到甚至超过C++的章节

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

0 0
原创粉丝点击