我一直在研究一个Java程序,它读取大型CSV文件,处理内容,并根据特定条件将其提交给Solr服务器。使用初始数据集,代码已经运行了一段时间。但由于它尚未经过广泛测试,所以我在最近运行大约四倍大小的另一个数据集(~2.2MB vs~640KB)时使用-ea
标志启用了断言。
即使将最大堆大小加倍到8G(OutOfMemoryException
),我也会使用新数据集遇到-Xmx8g
。我当前的代码不是特别节省内存,所以我可能能够解决代码中的问题。
但是,在阅读Java断言时,我注意到在这种情况下,内存消耗显然从未被讨论过。因此我的问题是:在JVM中启用断言是否会以可测量的数量增加内存消耗?在测试/调试代码和优化内存效率时是否应该考虑这一点?
答案 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()
可以迭代大量集合并进行实例检查或属性比较,以查找该项目是否为葡萄品种。