A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© iloveyou 中级黑马   /  2014-4-2 15:10  /  1708 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 iloveyou 于 2014-4-2 16:55 编辑

这个垃圾回收机制好多老师都提过,大都一笔带过,不知各位学长如何理解。请举例说明 C ,C++ ,Java 的区别。

5 个回复

正序浏览
Java语言中一个显著的特点就是引入了垃圾回收机制,使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
这是参照资料上的,自己的想法
回复 使用道具 举报
(1)C和C++不存在垃圾回收机制的概念,需要程序员手动释放资源;
(2)而对于JAVA,它存在垃圾回收机制,可以自动检测不需要的对象等资源,自动释放空间;
垃圾回收机制是是在JVM启动时有JVM创建的一个守护线程,负责不定时的清理内存垃圾,使得JAVA程序员不用再管垃圾回收的问题,这也是JAVA优于C++的一个原因之一
回复 使用道具 举报 1 0
_Water 发表于 2014-4-2 15:40
这里仅总结下JAVA的垃圾回收机制,不对的地方还望朋友们指出。由于本人C/C++没怎么接触过,希望有了解的朋 ...

谢谢!比较详细。看来要我好好理解才是真的,对知识不可模棱两可。
回复 使用道具 举报
Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。需要注意的是:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身
System.gc()
Runtime.getRuntime().gc()  
上面的方法调用时用于通知JVM可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。
回复 使用道具 举报
这里仅总结下JAVA的垃圾回收机制,不对的地方还望朋友们指出。由于本人C/C++没怎么接触过,希望有了解的朋友交流下。

垃圾产生的原因:在java中当没有对象引用指向原先分配给某个对象的内存,该内存便成为了垃圾。
垃圾回收机制原理:jvm会用一个系统级线程来释放原先分配给某个对象的内存,从而让这块内存空间能够被后来的新对象使用。

另外垃圾回收也可以清除内存记录碎片。
由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。


垃圾回收机制优点:
1.自动释放内存空间,减轻编程的负担。
2.使编程效率提高。在没有垃圾回收机制的时候,可能要花许多时间来解决一个难懂的存储器问题,靠垃圾回收机制可大大缩短时间。
3.保护程序的完整性, 是安全性策略的一个重要部份。
4.清除内存记录碎片。(由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片)

垃圾回收机制缺点:
1.开销影响程序性能。Java虚拟机必须追踪运行程序中有用的对象,而且最终释放没用的对象。这一个过程需要花费处理器的时间。
2.垃圾回收算法的不完备性,早先采用的某些垃圾回收算法就不能保证100%收集到所有的废弃内存。


另外:在垃圾回收机制中,还有一个方法叫finalize方法。在jvm垃圾回收器收集一个对象之前,一般要求程序调用适当的方法释放资源。但在没有明确释放资源的情况下,Java提供了缺省机制来终止该对象心释放资源,这个方法就是finalize。
其实很多时候,java的垃圾回收机制其实是不用编程人员来操心的,会被jvm自动回收再利用。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马