有人可以给我一些建议吗?我正在阅读旧文本和老师的一些注意事项,当使用Java的多个线程时,有必要编写一个特殊的垃圾收集程序。
这是否仍适用于Java SE6及更高版本?如果它确实可以有人提供标准的方法来做到这一点。
答案 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提供的自动内存管理的天赋。