关于JAVA垃圾回收

AllenSDD 2009-10-12 10:18:44
java里面有什么方法会让垃圾回收强制执行?
面试的时候问到这个问题了,我收没有,面试官还让我回去看java核心代码
多谢高人
...全文
323 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankyuJava 2011-11-03
  • 打赏
  • 举报
回复
其实我最讨厌这种“面试官还让我回去看java核心代码”
直接给个答案呗 这样大家回来讨论也知道他的所指。
zhangzhongke007 2009-10-12
  • 打赏
  • 举报
回复
路过,学习。
lzh_me 2009-10-12
  • 打赏
  • 举报
回复
以下是引用别人的:

Java的垃圾回收机制一般包含近十种算法。对这些算法中的多数,我们不必予以关心。只有其中最简单的一个:引用计数法,与编码有关。


一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃了。或者说,这个对象可以被垃圾回收机制回收了。


这就是说,当不存在对某对象的任何引用时,就意味着,应用告诉JVM:我不要这个对象,你可以回收了。


JVM的垃圾回收机制对堆空间做实时检测。当发现某对象的引用计数为0时,就将该对象列入待回收列表中。但是,并不是马上予以销毁。

许多人对Java的垃圾回收机制不放心,希望在应用代码里控制JVM的垃圾回收运作。这是不可能的事。对垃圾回收机制来说,应用只有两个途径发消息给JVM。第一个就是将指向某对象的所有引用变量全部移走。这就相当于向JVM发了一个消息:这个对象不要了。第二个是调用库方法System.gc(),多数书里说调用它让Java做垃圾回收。

第一个是一个告知,而调用System.gc()也仅仅是一个请求。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。


JVM的垃圾回收机制有多个算法。除了引用计数法是用来判断对象是否已被抛弃外,其它算法是用来确定何时及如何做回收。JVM的垃圾回收机制要在时间和空间之间做个平衡。为了提高系统效率,垃圾回收器通常只在满足两个条件时才运行:即有对象要回收且系统需要回收。垃圾回收要占用时间,因此,Java运行时系统只在需要的时候才使用它。因此你无法知道垃圾回收发生的精确时间。


lzh_me 2009-10-12
  • 打赏
  • 举报
回复
只能“督促”一下,不知道具体什么时候执行。System.gc();
AllenSDD 2009-10-12
  • 打赏
  • 举报
回复
他否认了GC()。有没有同志读了他所说的java核心代码?
zl3450341 2009-10-12
  • 打赏
  • 举报
回复
貌似不可以强制吧
ZangXT 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 justformygame 的回复:]
不同jvm,gc实现算法不同
不是所有的都可以强制gc
[/Quote]
嗯,至少可以通过命令行参数指定把System.gc()忽略掉。
justformygame 2009-10-12
  • 打赏
  • 举报
回复
不同jvm,gc实现算法不同
不是所有的都可以强制gc
ZangXT 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 allensdd 的回复:]
当时面试官是肯定的说有的……
[/Quote]
那他肯定认为是System.gc()了。
BearKin 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lvbang_lzt 的回复:]
以下是引用别人的:

Java的垃圾回收机制一般包含近十种算法。对这些算法中的多数,我们不必予以关心。只有其中最简单的一个:引用计数法,与编码有关。


一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃了。或者说,这个对象可以被垃圾回收机制回收了。


这就是说,当不存在对某对象的任何引用时,就意味着,应用告诉JVM:我不要这个对象,你可以回收了。


JVM的垃圾回收机制对堆空间做实时检测。当发现某对象的引用计数为0时,就将该对象列入待回收列表中。但是,并不是马上予以销毁。

许多人对Java的垃圾回收机制不放心,希望在应用代码里控制JVM的垃圾回收运作。这是不可能的事。对垃圾回收机制来说,应用只有两个途径发消息给JVM。第一个就是将指向某对象的所有引用变量全部移走。这就相当于向JVM发了一个消息:这个对象不要了。第二个是调用库方法System.gc(),多数书里说调用它让Java做垃圾回收。

第一个是一个告知,而调用System.gc()也仅仅是一个请求。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。


JVM的垃圾回收机制有多个算法。除了引用计数法是用来判断对象是否已被抛弃外,其它算法是用来确定何时及如何做回收。JVM的垃圾回收机制要在时间和空间之间做个平衡。为了提高系统效率,垃圾回收器通常只在满足两个条件时才运行:即有对象要回收且系统需要回收。垃圾回收要占用时间,因此,Java运行时系统只在需要的时候才使用它。因此你无法知道垃圾回收发生的精确时间。



[/Quote]

学习了 这也就说明了为什么对象用完之后马上要将他指向NULL 另外 如果LZ你有心的话可以尝试下 new他几W个对象 然后重写那个对象的finalize方法 看看他啥时候会销毁

另外面试官不是绝对正确的
AllenSDD 2009-10-12
  • 打赏
  • 举报
回复
当时面试官是肯定的说有的……

50,523

社区成员

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

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