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

时间:2015-02-16 09:38:34

标签: java assertions jvm-arguments

我一直在研究一个Java程序,它读取大型CSV文件,处理内容,并根据特定条件将其提交给Solr服务器。使用初始数据集,代码已经运行了一段时间。但由于它尚未经过广泛测试,所以我在最近运行大约四倍大小的另一个数据集(~2.2MB vs~640KB)时使用-ea标志启用了断言。

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

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

2 个答案:

答案 0 :(得分:3)

嗯,一个断言如:

assert condition : "error message";

获取编译成一个简单的check-and-throw语句:

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

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

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

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

答案 1 :(得分:1)

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

内存消耗可能会增加很多,但这取决于您在断言主体中尝试执行的内容。这可能是一项需要进行密集工作的巨大方法。即你正在做的断言的实际工作。 e.g

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

方法numberOfGrapesInFriutColumn()可以迭代大量集合并进行实例检查或属性比较,以查找该项目是否为葡萄品种。