java - 使用 JRE -Xms300m 将我的执行时间减半?

标签 java

大家好,我想知道是否有人可以提供某种解释或证实我的猜测。

我有一个带有 for 循环的程序,该程序执行了数十万次,每次都将数字添加到选定的 ArrayList 中。对为什么执行需要这么长时间感到困惑,我进一步调查。

原来如果我有

(for int i =0; i < 50000; i++)

如果我有的话,这将花费几乎两倍的时间

(for int i=0; i < 40000; i++)

i 增加到超过 50000 甚至高达 100000 实际上并没有花费太多额外时间。只是在 40000 到 50000 之间的某个地方有这么大的跳跃

戴上我的思考帽,我发现可能存在某处内存不足的问题?并且必须提供更多内存,但我不确定为什么需要这么长时间。

无论如何,我发现通过添加 JRE 参数 -Xms300m 它解决了这个问题。我是否正确地认为这会以 300mb 的堆大小启动程序,从而不需要稍后分配额外的堆空间。

还有什么我不明白的是我为 arrayLists 创建了足够多的内存。我认为问题会在我分配堆内存时发生在这里,而不是在我使用 .add() 方法时发生。

new ArrayList<Integer>(5000);

最佳答案

是的,-Xms 选项指定起始堆空间。如果这加速了您的问题,那么您很可能遇到了内存分配/垃圾收集问题。注意 ArrayList API:

“每个 ArrayList 实例都有一个容量。容量是用于存储列表中元素的数组的大小。它总是至少与列表大小一样大。当元素被添加到 ArrayList 时,它的容量自动增长。除了添加元素具有恒定的摊销时间成本这一事实外,没有指定增长策略的细节。

应用程序可以在使用 ensureCapacity 操作添加大量元素之前增加 ArrayList 实例的容量。这可能会减少增量重新分配的数量。 "

因此,ArrayList 如何添加内存是 JVM 的一个实现细节,但具有恒定的摊销成本。

我打赌您正在数组中创建对象,在 40k 到 50k 次迭代之间,您的程序尝试 GC,失败,然后添加更多堆。指定更高的最小值会延迟 GC 和更多的堆创建...

关于java - 使用 JRE -Xms300m 将我的执行时间减半?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4006619/

相关文章:

java - 返回 int 值的 boolean 方法;

java - Java 小程序中的 drawImage 在 Safari 中闪烁

java - 我们可以做我们自己的内存管理吗?

java - 在将字符串存储到数组之前,如何将它们放入 HashMap 中?

java - 方案 : wasb error in Hadoop 2. 7 没有文件系统

java - 如何在调整浏览器大小时调整 java applet 的大小?

java - 在面板上显示图像 after after 并留有时间间隙

java - AesZipFileEncrypter zipAndEncrypt 方法将所有文件夹树添加到文件

java - ExecutorService 变慢,使我的电脑陷入困境

java - Android - 将 ARGB 颜色转换为 RGB