[英]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 为您提供了打开 Java GC 或关闭 Java GC 的二进制选项。 要关闭 Java GC,您需要使用 Epsilon Garbage Collector,它必须在命令行中关闭。 在 Java 11 上,使用以下两个 JVM 参数:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
如果没有UnlockExperimentalVMOptions
参数,JVM 将无法启动,因此请确保包含它。
不幸的是,如果您不使用 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.