有人能给我一些建议吗?我读了一篇旧文和老师的一些笔记,告诉我在Java中使用多线程时,有必要编写一个专门的程序来进行垃圾收集。
这在Java SE6及更高版本中仍然适用吗?如果是这样的话,有人能提供标准的方法来做到这一点吗?
发布于 2012-06-19 02:25:12
使用垃圾收集器可以更轻松地编写多线程代码。这是因为在多线程上下文中手动释放资源是很难做到的。有了GC,你大部分时间都不需要担心。
我读到,当使用多个线程时,有必要编写一个专门的程序来进行垃圾回收。
我不相信曾经有过这种情况。
做到了这一点,在SE6和更高版本中仍然适用,如果是这样的话,有一种标准的方法来做到这一点。
执行此操作的标准方法是不引用不需要的对象。例如,如果你有一个不需要的局部变量,让它退出作用域。
它不需要很复杂。
发布于 2012-06-19 01:26:56
据我所知,只要没有指向某个对象,该对象就会被垃圾回收器释放。
Java的垃圾收集器在循环引用方面非常健壮,我不明白为什么它不能与同时运行的多个线程一起工作。
因此,您可以放心地假设,您不需要为垃圾收集编写特殊的程序,因为将非常有效地为您做这件事。
如果你想在java中释放对象,只需要确保没有变量在引用你的对象。(包括来自java集合或其他库的结构(列表、数组等))
发布于 2016-06-09 10:43:37
这篇来自2003年,J2SE 1.4.1 boosts garbage collection的JavaWorld的文章是关于J2SE 1.4.1之前的Java垃圾收集的:
标记和清除是一种“停止世界”垃圾收集技术;也就是说,所有应用程序线程都会停止,直到垃圾收集完成,或者直到更高优先级的线程中断垃圾收集器。如果垃圾收集器被中断,它必须重新启动,这可能导致应用程序颠簸,但几乎没有明显的结果。标记和清除的另一个问题是,许多类型的应用程序不能容忍其停止世界的性质。对于需要接近实时行为的应用程序或为大量面向事务的客户端提供服务的应用程序,情况尤其如此。
来自2009年,G1: Java's Garbage First Garbage Collector的Dr.Dobbs上的一篇文章谈到了SE6之前的Java垃圾收集器。
直到最近,Java还提供了两个主要的收集器:并行收集器和并发标记清除(
)收集器--请参阅侧栏并行性和并发性。在最新的JavaSE6更新版本中,G1收集器是另一种选择。G1的计划是最终取代CMS,成为一个低暂停、软实时收集器。让我们来看看它是如何工作的。
因此,在SE 6之前,帮助Java垃圾收集的一些额外预防措施可能会有所帮助,特别是对于具有大量临时变量的多线程应用程序,这些临时变量会生成需要收集的垃圾。但是,这最多需要在较慢的时间内显式调用垃圾收集器。写一些特别的东西看起来很不寻常。
然而,情况比以前有了很大的改善。另外,不同版本的Java虚拟机之间的垃圾收集可能会有所不同。
因此,几年前可能是真的,现在的技术几乎肯定不是真的。
这篇名为How to monitor Java memory usage?的文章讨论了监控Java内存使用情况,以及显式调用垃圾收集器的一些利弊。
甲骨文有一个涵盖JavaSE7热点JVM的Java Garbage Collection Basics tutorial。
https://stackoverflow.com/questions/11087875
复制相似问题