繁体   English   中英

如何禁用 Java 垃圾收集器?

[英]How can I disable Java garbage collector?

我们有一个 PHP 网络应用程序,它调用 Java 二进制文件来生成 PDF 报告(使用 JasperReports)。 Java 二进制文件将 PDF 输出到标准输出并退出; PHP 然后将 PDF 发送到浏览器。 这个 Java 命令持续大约 3 到 6 秒,我认为它持续 6 秒是因为 GC 启动。我想禁用 GC,因为无论如何当命令退出时,所有内存都会返回。

我想知道如何为 Java 1.4.2 和 Java 1.6.0 禁用它,因为我们目前正在测试两个 JVM 以查看哪个执行速度更快。

听起来您正在努力节省时间,但却以错误的方式进行。 与启动和关闭 java 进程所花费的时间相比,禁用垃圾收集所节省的时间将是微不足道的(对于单个任务)。 如果运行时性能是您的目标,您可能需要考虑启动一个 Java 进程,您可以多次要求该进程执行所需的工作。

没有办法完全禁用垃圾收集。 垃圾收集仅在 JVM 空间不足时运行,因此您可以为程序提供更多内存。 将这些命令行选项添加到 Java 命令

-Xmx256M -Xms256M

这为程序提供了 256Mb 的内存(默认为 64Mb)。 不过,对于默认大小的 JVM,垃圾收集不会花费 3 秒,因此您可能需要更仔细地调查程序在做什么。 Yourkit 分析器对于找出需要很长时间的内容非常有用。

GC 仅在 JVM 内存不足时才会启动,因此您要么 GC 要么死。 尝试打开详细 GC,看看它是否真的需要大量时间。

java -verbose:gc

Java 11 带有一个无操作垃圾收集器

它可以在 JVM 启动时通过-XX:+UseEpsilonGC选项启用。

根据JEP 的描述,其目标之一是使某些短期工作更有效率,您可能会使用什么用例:

极短命的工作。 短期作业可能依赖于快速退出以释放资源(例如堆内存)。 在这种情况下,接受 GC 循环以徒劳地清理堆是浪费时间,因为无论如何堆都会在退出时被释放。 请注意,GC 周期可能需要一段时间,因为它取决于堆中的实时数据量,这可能很多。

Java 11 为您提供了打开 Java GC 或关闭 Java GC 的二进制选项。 要关闭 Java GC,您需要使用 Epsilon Garbage Collector,它必须在命令行中关闭。 在 Java 11 上,使用以下两个 JVM 参数:

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

如果没有UnlockExperimentalVMOptions参数,JVM 将无法启动,因此请确保包含它。

无法停止 Java GC

不幸的是,如果您不使用 Epsilon GC,则无法禁用、停止或阻止垃圾收集的发生。 就像无法触发 GC 一样,您也无法停止 Java GC 算法是不确定的。 只有 JVM 可以控制它们何时发生。

您可以使用-Xmx选项来设置最大堆大小; 使用更大的堆应该可以防止 VM 内存不足,从而很快就需要垃圾收集。

您确定是垃圾收集导致速度变慢吗? 您是否使用 -verbose:gc 运行 java 以查看发生了什么?

您不能在 JVM 上禁用垃圾收集。 但是,您可以考虑调整垃圾收集器以获得更好的性能。

正如大家所说,您不能在 JVM 中禁用 GC,这是有道理的,因为如果可以的话,由于 Java 没有明确的方式让开发人员删除堆数据,因此会出现内存泄漏。

您是否可以访问此 java 二进制文件的源代码? 如果是这样,可能值得对其进行分析并查看是否存在可以更好地编写以减少 GC 活动的瓶颈。 这可以通过大多数 Java 分析器来完成,例如 JProbe。

为了避免垃圾收集器从任何对象中释放变量或属性,您必须在类中将此属性(由 gc 释放)设置为静态,这是我的解决方案。

例子:

私有静态字符串 myProperty;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM