java 垃圾收集的两种方法

minhw 2010-04-24 12:35:33
前几天去一个公司面试,其中问道,java语言中垃圾收集的两种方式。

再次想请教一下大家,这个问题怎么回答。


一直认为:
java语言中垃圾收集是JVM自动完成的,程序员是不能手动收集那个那个垃圾的,程序员能做的只能是通知垃圾收集器去运行,但是真正的垃圾收集器什么时候执行,去收集什么那些垃圾,程序员是不能控制的。

所以当听到这个问题的时候,一时不知道怎么回答,当时我想到的是System.gc() 和Runtime.getRungtime.gc()。但这些并不能让垃圾收集其立即执行,不能算作是垃圾收集的方法。

不知道大家听到这样的问题后应该怎么回答。
...全文
284 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
毛毛虫3号 2010-04-26
  • 打赏
  • 举报
回复
学习了 刚接触java 缺少的是理解
memoryshy 2010-04-26
  • 打赏
  • 举报
回复
谢谢哦,我也学习了,哈哈
minhw 2010-04-26
  • 打赏
  • 举报
回复
顶一下 看看那还有没有高人
minhw 2010-04-25
  • 打赏
  • 举报
回复
4楼说的很好啊

长见识了
不过以后碰到这样的情况 应该怎么回答呢

我现在觉得是中国的一句古话了.阎王爷好见,小鬼难缠.不是害怕碰见高说,只是害怕碰见二把刀
木子0204 2010-04-25
  • 打赏
  • 举报
回复
学习了!!!!
gesanri 2010-04-24
  • 打赏
  • 举报
回复
我想他问的应该是2种算法吧?
我记得一种是有2块内存区域,先把其中1块上的所有存活的对象放到另一块上,完后再整个回收第一块内存,这个是适合那种年轻代的垃圾
而另一种是先扫描一遍,把所有存活的对象都标记出来,接着第二遍扫描,所有没有被标记的都被回收,这个适合年老代的垃圾(也就是几次垃圾回收都没回收掉的顽固分子)
当然还有别的方法,你自己查下吧
chongyou520 2010-04-24
  • 打赏
  • 举报
回复
学习了。。。。
  • 打赏
  • 举报
回复
垃圾收集器在 JVM 中是一个守护线程,在 JVM 启动时开始执行,不过大多数的时候都在睡觉,直到 JVM 内存吃紧的时候才开始醒来工作。

System.gc() 与 Runtime.getRuntime().gc() 的作用是一致的,其实是同一种东西的不同调用,在 System.gc() 中也是调用 Runtime.getRuntime().gc() 的,这点在 API DOC 上有很明确的说明。

执行 System.gc() 时,垃圾收集器会不会运行是无法控制的,他有可能会被惊醒后运行一下,有可能就是叫不醒。System.gc() 只能告之 GC:你还有垃圾没有清理掉,马上爬起来去打扫。如果 GC 认为:我刚才已经清理得很干净了,没东西要清理了。那么 System.gc() 执行后 GC 根本就不会理会去理会你。如果 GC 认为:对哦,我好像好长时间没有打扫了,垃圾好像是挺多了。这时 GC 会执行,不过基本上不会是立即的,可能要过段时间,因为 GC 线程的优先级比较低,需要给优先级别高的线程让路。

因此,我并不认为 System.gc() 和 Runtime.getRuntime().gc() 是垃圾收集的两种方法。充其量是通知 GC 进行垃圾收集的一种通知机制,并不是方法。而且也不是两种,只是一种,因为 System.gc() 是调用 Runtime 的那个方法,从 System.gc() 的源代码或者 API DOC 中就可以看出:

    /**
* Runs the garbage collector.
* <p>
* Calling the <code>gc</code> method suggests that the Java Virtual
* Machine expend effort toward recycling unused objects in order to
* make the memory they currently occupy available for quick reuse.
* When control returns from the method call, the Java Virtual
* Machine has made a best effort to reclaim space from all discarded
* objects.
* <p>
* The call <code>System.gc()</code> is effectively equivalent to the
* call:
* <blockquote><pre>
* Runtime.getRuntime().gc()
* </pre></blockquote>
*
* @see java.lang.Runtime#gc()
*/
public static void gc() {
Runtime.getRuntime().gc();
}
minhw 2010-04-24
  • 打赏
  • 举报
回复
确实是垃圾收集的两种方法,笔试题上是这么写的,我不知道怎么作答,就没有写,然后又口头问了我两遍,第一编的时候 我说了是不是算法,比如自增量算法。然后问过几个问题之后又问了一遍,我就说不知道了。

那个面试我的人比较年轻,我当时想问他真的对java理解吗,但是毕竟是在人家的地盘就没有问。

其中还闻到我这样一个问题。String str="ss"; str=str+"fdsfs"; 我就告诉他从法律上是可以的,但是从效率上会有点不同,有垃圾产生。他还一追问我,这样可以吗。不明白,难道他想让我说不可以吗?

当时真想反问他一些问题。

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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