启用 Java 断言会显着增加内存消耗吗?

Does enabling Java assertions increase memory consumption significantly?

我一直在开发一个 Java 程序,该程序读取大型 CSV 文件、处理内容并根据特定条件将其提交到 Solr 服务器。该代码在初始数据集上运行良好已有一段时间。但是因为它还没有被广泛测试,所以当最近 运行 在另一个大约四倍大小的数据集上(~2.2MB vs ~640KB)时,我启用了带有 -ea 标志的断言。

我 运行 使用新数据集 OutOfMemoryException 即使在将最大堆大小加倍到 8G (-Xmx8g) 之后也是如此。我当前的代码不是特别节省内存,所以我可能能够在代码中解决这个问题。

但是,在阅读 Java 断言时,我注意到在这种情况下显然从未讨论过内存消耗。因此,我的问题是:在 JVM 中启用断言是否会以可测量的量增加内存消耗?在 testing/debugging 代码和优化内存效率时是否应该考虑这一点?

嗯,我不确定确切的数字,但我认为它肯定会增加一点内存消耗,因为它必须执行断言。

内存消耗可能会增加很多,但这取决于您尝试在断言主体中执行的内容。这可能是一个巨大的方法调用来进行密集的工作。即你正在做的实际工作来断言某事。例如

assert(numberOfGrapesInFriutColumn()==5:"Number of grapes is not 5")

方法 numberOfGrapesInFriutColumn() 可以遍历庞大的集合并进行实例检查或属性比较以查找该项目是否不是葡萄。

嗯,这样的断言:

assert condition : "error message";

编译成一个简单的检查并抛出语句:

if(!$assertionsDisabled && !condition)
    throw new AssertionError("error message");

其中 $assertionsDisabled 是编译器为存在断言的每个 class 生成的常量字段:

static final boolean $assertionsDisabled = !ThisClass.class.desiredAssertionStatus();

所以我会说开销很小,尤其是在内存方面。我会使用分析器并测量给定应用程序的内存消耗。您可能会发现其他地方存在内存问题。