请来讨论:Java中的垃圾收集与C++的直接内存管理那个更好?

leejidongdong 2002-04-02 09:42:34
本人认为:
首先,他们都是对于heap(堆)的操作。都是用于回收不再使用的堆内存,Java的垃圾处理机制是由JVM自动保存每个堆的句柄,定时向前移动指针,形成流水线,以方便下一次的内存分配,而且防止了分页错误的发生。而C++的直接内存管理中,如果程序员在使用完某个对象之后,忘记了回收内存,在需要给新的对象分配内存的时候,C++将在已经开辟但是没有回收的heap内存区域中轮训,并在其中选一个分配给它,这样也就造成效率的降低。
其次,Java中的垃圾收集机制可以减小程序的风险,使程序员可以专注于程序的功能,但同时也丧失了一定的效率;而C++的直接内存管理,则使程序员更清晰的了解程序的运作,但是对于程序的粗心,容易造成内存的泄漏。
最后,看到有些书上的描述,据说Java的垃圾收集机制并不是总能知道回收那些已经完成的堆内存区域,同样需要进行手工处理。
...全文
84 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
leizhengdeng 2002-05-09
  • 打赏
  • 举报
回复
"而C++的直接内存管理中,如果程序员在使用完某个对象之后,忘记了回收内存,在需要给新的对象分配内存的时候,C++将在已经开辟但是没有回收的heap内存区域中轮训,并在其中选一个分配给它,这样也就造成效率的降低。"

这句话错了吧。
kicku 2002-04-02
  • 打赏
  • 举报
回复
这个问题在usnet上讨论过,最后由于C++智能指针的出现,java败得一塌糊涂。
t 2002-04-02
  • 打赏
  • 举报
回复
1、C++主要在栈(stack)中分配内存,而java主要在堆(heap)中分配(基本数据类型在栈中分配)。[1]
2、同意cyberworm(虫子)的意见,“手工处理是不可能的”。不过可以“setting references to null to allow cleanup”。[2]

[1][2]参见《Think in Java,2nd Edtion》影印版机械工业出版社P215 P397

新的concorrent garbage collector将出现在j2sdk1.4.1中。
新的parallel garbage collector将出现在j2sk1.5中。
具体可以浏览http://java.sun.com/docs/hotspot/index.html
itok000 2002-04-02
  • 打赏
  • 举报
回复
java的垃圾收集器可以说是java的一大特点。它的最基本特点是当一个对象或实例不再用的时候,就建议收集器回收内存,注意是建议不是一定回收,如果收集器见到一个对象满足回收的条件就回收该对象。而c/c++中内存由程序员自己来确定该对象是否应该回收,如果回收得对倒没什么,如果不对,就是致命的错误,可想而知道,那可是物理内存!!虽然在java中可能有一些内存不能及时回收,只是占用一些内存而已(而且现在内存也不是很贵!!呵呵)。程序首先是正确性,没有这个其它什么都没有用!
cyberworm 2002-04-02
  • 打赏
  • 举报
回复
java的垃圾收集对效率的一种妥协。效率的丧失是肯定的。java的垃圾收集并不像你说的,手工处理是不可能的,最多你只能用System.gc()来建议jvm收集泄漏的资源。
refc 2002-04-02
  • 打赏
  • 举报
回复
为什么java的参数-Xmx , -Xms 不见生效,求示例
leejidongdong 2002-04-02
  • 打赏
  • 举报
回复
java当中当然有不用new生成的对象啦!比如数组的初始化,呵呵!
kkhui 2002-04-02
  • 打赏
  • 举报
回复
[Java中的垃圾收集只能用来回收由new生成的对象吗?]
除了用new生成对象,Java还有什么其它方式生成对象??没听说过
leejidongdong 2002-04-02
  • 打赏
  • 举报
回复
Java中的垃圾收集只能用来回收由new生成的对象吗?请谈谈Java中还有那些生成对象的方法。
C++的智能指针不是很早就出现了吗?在COM技术中就有应用(类厂的建立),请kicku好好谈谈!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧