【发布时间】:2019-11-02 04:11:33
【问题描述】:
我在自己的应用程序中面临具有挑战性的内存问题。我想解决内存泄漏问题,因此我不想创建太多对象和数组,而是想重用最后分配的内存(使用对象和数组池)。
在我的一个场景中,我想将已分配数组的单元格向右移动特定长度。为此,我实现了以下简单的解决方案:
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 首先被复制到一个临时数组中,长度为 组件,然后复制临时数组的内容 通过目标的 destPos+length-1 进入位置 destPos 数组。
此方法使用临时数组从 src 复制到 dest。我认为这种方法会在高事务系统中创建太多数组,从而导致新的性能问题。
能否请您讨论一下这两种解决方案?
提前致谢。
【问题讨论】:
-
你能不能试试看性能是否可以接受?
-
在高负载下实施和测试解决方案对我来说有时间成本。因此,根据文档,它似乎存在性能问题。
-
“我想解决内存泄漏问题...” - 如果您真的是指内存泄漏,那么(IMO)您正在以错误的方式解决问题.使用内存配置文件来追踪泄漏的来源。这比重写代码以最小化对象分配要少得多。
标签: java arrays performance memory-management