【问题标题】:Do I have to implement garbage collection manually in Java?我必须在 Java 中手动实现垃圾收集吗?
【发布时间】:2019-03-08 08:13:54
【问题描述】:

我已经阅读了一些关于 Java 垃圾收集的内容,但我找不到在代码中处理垃圾收集的“最佳实践”。我应该在使用后将每个变量设置为null,还是只使用默认的垃圾收集器更高效、更高效?还是在这种情况下我必须通过命令行参数配置垃圾收集器?

感谢您的建议!

【问题讨论】:

  • 不,你没有
  • 你不应该自己处理任何这些。 Java 在幕后完成了所有这些工作。您可以专门在代码中添加对 GC 的调用,但它们只是运行 GC 的“请求”,它们不保证它会实际运行。您可以做的是确保当变量过时时,将它们标记为已准备好进行垃圾回收
  • 最佳实践是让JVM来处理。不要管它。大多。将null 分配给变量几乎总是不必要的。运行 GC 几乎总是不可取的。即一个坏主意。仅当您有明确的证据表明 GC 表现不佳时,才建议调整 GC。 (不明智的 GC 调整可能会使 GC 性能比不理会它更差。)
  • 与所有优化一样:忘记它。避免愚蠢的算法(例如,冒泡排序),使用良好的数据结构(Java 本身有很多,在 Guava 和其他库中更多),用简短的方法编写干净的代码。尤其是 GC 应该按原样工作,对于 99% 的情况,最佳做法是不要管它,因为更有经验的人已经对其进行了调整。

标签: java performance garbage-collection jvm command-line-arguments


【解决方案1】:

不,JVM 会为你做这件事。这就是为什么它是一种具有自动内存管理的语言。如果需要,由于性能问题,您可以调用:

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

但不能保证垃圾收集器会删除未引用的对象。这是对JVM的建议。 只有在您知道自己在做什么的情况下。风险自负。

您可以做的是选择适合您需求的垃圾收集器实现。例如,如果您不想回收任何内存,出于测试目的,您可以通过添加XX:+UseEpsilonGC 标志来选择epsilon

【讨论】:

  • 不好的建议。手动运行gc() 可能会使应用程序性能变差......因为应用程序通常没有足够的信息来知道何时运行它。
【解决方案2】:

垃圾收集器主要是自己完成工作。你不需要任何东西。但是你甚至可以看到垃圾收集器清除 JVM 内存,如图所示

自动垃圾回收是查看堆内存,识别哪些对象正在使用,哪些没有,并删除未使用的对象的过程。

更多信息:Java Garbage Collection Basics

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2010-12-13
    • 1970-01-01
    • 2017-07-13
    相关资源
    最近更新 更多