【问题标题】:How to move objects from one ArrayList to another, avoiding GC problems如何将对象从一个 ArrayList 移动到另一个,避免 GC 问题
【发布时间】:2014-12-13 17:34:01
【问题描述】:

我最近使用 LibGdx 实现了一个网格系统(空间分区)来优化碰撞检测的性能。我在板上生成了 2000 个实体,让它们四处移动,重新计算它们在网格上的新图块位置,并在必要时将实体转移到正确的集合中。

问题:

GC_FOR_ALLOC freed 3068K (65765), 45% free 3925K/7124K, paused 36ms, total 36ms

在 Android 上大约每秒发生一次,导致渲染出现卡顿。

代码:

这是由每个实体运行的:

if(newgridy!=currentgridy||newgridx!=currentgridy){
        try {
            my_tile.remove(this);
            my_tile = grid[newgridy][newgridx];
            my_tile.add(this);
        }catch (ArrayIndexOutOfBoundsException e){

        }
}

newgridy,newgridx,currentgridy,currentygridx 是平铺坐标(不是渲染坐标)

my_tile 是一个数组列表

grid 是 ArrayLists 的二维数组

我的尝试:

我知道这是有问题的代码块,因为当我将其注释掉时,GC 调用就会消失。

我认为重复的 remove 和 add 调用会导致内存碎片化,并且 ArrayList 变得太大而无法放入内存中的任何连续位置,因此当我的 Entities 进入新的 tile 时,GC 必须压缩。我想我应该为每个图块预先分配空间,但每个图块可能同时包含 1000 多艘船,有时甚至是完全空的。然后我将不得不分配 1000 以适应它已满时的情况,但如果瓷砖是空的,那将是巨大的浪费。

问题

内存碎片是我的问题吗?如果是这样,Java 中是否有一个可以不连续的集合?或者其他解决方法?

是否会切换到四叉树以获得优化帮助?

抱歉有多个问题,有点宽泛。

【问题讨论】:

    标签: java android performance data-structures garbage-collection


    【解决方案1】:

    阅读http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.ensureCapacity%28int%29(可能是错误的实现,但可能相似)表明这不是碎片。删除只是将数据向下复制一个空间,并在必要时添加仅增加内存;没有碎片。随着 GC 的大量废弃数组,大小在增加到 1000 的过程中增加了很多:可能是这样吗?

    【讨论】:

    • 所以这不是碎片,感谢您清除它。你说的废弃数组是什么意思?
    • 我不是Java内存管理细节方面的专家;这只是我阅读源代码的最佳猜测。我的意思是,首先数组是 10 长,然后是 15、23、36、... 项长,每次乘以 1.5,每个数组在使用时都会被丢弃。所以,那些被丢弃的数组就是我所说的丢弃。
    • 哦,好吧,这是有道理的。所以我的问题变成了如何拥有所有这些集合: 1. 能够存储 0-1000+ 值,而不必在每次扩展时丢弃数组。 2.能够拥有数千个这样的集合(用于网格)。我应该提出一个新问题还是编辑这个问题?
    • 等一下,这将如何解释 GC 释放 3000k 字节?由于 ArrayList 是引用,因此 1000 的 arrayList 在 32 位系统上将是 4kb-ish,在 64 位系统上是 8k,对吧?即使被释放的是大量废弃的,它也不应该加起来那么多。
    • 我不知道。我估计每个提高到 1000 的阵列需要 2700 x 4 = 10.8 kB,所以除非您将 300 个阵列提高到该大小 每秒,否则我一定是错的。你还没有打电话给trimToSize,是吗?
    猜你喜欢
    • 2012-06-30
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2015-03-07
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多