我在自己的应用程序中面临着具有挑战性的内存问题。我想解决内存泄漏问题,所以我不想创建太多的对象和数组,而是要重用最近分配的内存(使用对象和数组池)。
在我的一种情况下,我想将已分配数组的单元格向右移特定长度。为此,我实现了以下简单解决方案:
private void shiftRight(int length) {
for (int index = size + length - 1; index >= length; index--) {
bytes[index] = bytes[index - length];
}
}
当我搜索这个问题时,我发现我可以使用System.arraycopy
代替我的简单解决方案。
System.arraycopy(bytes, 0, bytes, length, size);
但是我担心System.arraycopy
的性能。如该方法的文档所述:
如果src和dest参数引用相同的数组对象,则 就像执行srcPos位置上的组件一样执行复制 srcPos + length-1首先被复制到具有length的临时数组中 组件,然后复制临时数组的内容 通过目标的destPos + length-1进入位置destPos 数组。
此方法使用临时数组从src复制到dest。我认为这种方法会在高事务系统中创建太多数组,从而导致新的性能问题。
能否请您讨论这两种解决方案?
谢谢。
答案 0 :(得分:3)
句子中的关键词是“好像”。它实际上并没有使用临时数组。描述只是说它像 一样工作(换句话说,它不会覆盖本不应该的东西)。
您可能想比较System.arraycopy
与for循环的性能,因为我相信我在某处看到for循环对于较短的数组可以更快。