Java中的多个线程和垃圾收集

时间:2012-06-18 17:22:51

标签: java garbage-collection

有人可以给我一些建议吗?我正在阅读旧文本和老师的一些注意事项,当使用Java的多个线程时,有必要编写一个特殊的垃圾收集程序。

这是否仍适用于Java SE6及更高版本?如果它确实可以有人提供标准的方法来做到这一点。

5 个答案:

答案 0 :(得分:2)

据我所知,只要没有任何东西指向某个对象,该对象就会被垃圾收集器释放。

Java的垃圾收集器在循环引用方面非常强大,我不明白为什么它不适用于同时运行的多个线程。

因此,您可以安全地假设您不需要为垃圾收集编写特殊程序,因为java会非常有效地为您完成。

如果要在java中释放对象,只需确保没有变量引用您的对象。 (包括来自java集合或其他库的结构(列表,数组等))

答案 1 :(得分:2)

使用垃圾收集器可以更轻松地编写多线程代码。这是因为在多线程上下文中手动释放资源很难做到。使用GC,您无需担心大部分时间。

  

我正在阅读当使用多个线程时,有必要为垃圾收集编写一个特殊程序。

我不相信过这种情况。

  

这是否仍适用于SE6及以上版本,若有,则有标准方法可以执行此操作。

执行此操作的标准方法是不引用您不需要的对象。例如如果你有一个你不需要的局部变量,那就让它超出范围。

它不一定非常复杂。

答案 2 :(得分:1)

本文来自 JavaWorld in 2003 J2SE 1.4.1 boosts garbage collection,这篇文章说明了J2SE 1.4.1之前的Java垃圾收集:

  

标记和扫描是一个“停止世界”#34;垃圾收集技术;   也就是说,所有应用程序线程都会停止,直到垃   完成,或直到更高优先级的线程中断垃圾   集电极。如果垃圾收集器被中断,它必须重启,   这可能导致应用程序抖动,几乎没有明显的结果。   标记和扫描的另一个问题是许多类型的   应用程序无法容忍其停止世界的性质。那是   特别适用于需要接近实时行为的应用程序   或那些为大量面向交易的客户提供服务的人。

博士的文章。来自2009年的Dobbs G1: Java's Garbage First Garbage Collector,可以在SE 6之前说明Java垃圾收集器。

  

直到最近,Java SE还带来了两个主要的收集器:并行   收集器和并发标记扫描(CMS)收集器 - 请参阅   侧边栏并行和并发。截至最新的Java SE 6更新   发布时,G1收集器是另一种选择。该计划适用于G1至   最终将CMS替换为低暂停,软实时收集器。让' S   看看它是如何工作的。

所以可能是在SE 6之前,一些额外的预防措施来帮助Java垃圾收集可能会有所帮助,特别是对于具有相当数量的临时变量的多线程应用程序,这些应用程序会产生需要收集的垃圾。但是,这应该最多需要在缓慢的时间内对垃圾收集器进行显式调用。写一些特别的东西似乎很不寻常。

然而,事情比他们有了更多改善。另外,垃圾收集可能因Java虚拟机的不同版本而异。

所以现在几年前的情况几乎肯定不是现在的技术。

此帖子How to monitor Java memory usage?讨论了监视Java内存使用情况以及显式调用垃圾收集器的一些优缺点。

Oracle有一个涵盖Java SE 7 Hotspot JVM的Java Garbage Collection Basics tutorial

答案 3 :(得分:0)

使用以下代码显式调用垃圾收集器

Runtime runtime = Runtime.getRuntime(); 
runtime.gc();

但是不需要,jvm会自动处理正确的GC运行。

答案 4 :(得分:0)

几乎可以肯定,你的讲师的注意事项(正确地)说明,由于Java是一个多线程环境,因此在Java运行时环境中实现垃圾收集器时需要更加谨慎,而只需要一个线程就可以了。参与其中。对于任何多线程环境都是如此。

正如其他人所说的那样,程序员并没有看到任何这种复杂性。这是gc提供的自动内存管理的天赋。