【发布时间】:2015-05-17 18:34:19
【问题描述】:
在创建体素游戏的过程中,我正在对基本块系统进行一些性能测试。
一个块由 y 轴上的 16 个图块组成。瓦片是材质 ID 的 Hashmap。 key是一个byte,material id是一个short。
根据我的计算,一个块应该是 12KB + 一点点(假设是 16KB)。 16*16*16*3。 3 代表一个字节和一个短(3 个字节)。
我基本上不明白的是,我的应用程序使用的内存比预期的要多得多。实际上每个块大约 256KB。它使用大约 2GB 运行 8192 个块。请注意,这是块存储性能测试,因此不是整个游戏。
另外一个奇怪的地方是每次运行它的内存使用量从 1.9GB 到 2.2GB 不等。代码中没有随机化器,因此它应该始终是相同数量的变量、数组、元素等。
这是我的代码:
public class ChunkTest {
public static void main(String[] args) {
List <Chunk> chunks = new ArrayList <Chunk>();
long time = System.currentTimeMillis();
for(int i = 0; i<8192; i++) {
chunks.add(new Chunk());
}
long time2 = System.currentTimeMillis();
System.out.println(time2-time);
System.out.println("Done");
//System.out.println(chunk.getBlock((byte)0, (byte)0, (byte)0));
while(1==1) {
//Just to keep it running to view memory usage
}
}
}
其他类
public class Chunk {
int x;
int y;
int z;
boolean solidUp;
boolean solidDown;
boolean solidNorth;
boolean solidSouth;
boolean solidWest;
boolean solidEast;
private HashMap<Byte, HashMap<Byte, Short>> tiles = new HashMap<Byte, HashMap<Byte, Short>>();
public Chunk() {
HashMap<Byte, Short> tile;
//Create 16 tiles
for(byte i = 0; i<16;i++) {
//System.out.println(i);
tile = new HashMap<Byte, Short>();
//Create 16 by 16 blocks (1 is the default id)
for(short e = 0; e<256;e++) {
//System.out.println(e);
tile.put((byte) e, (short) 1);
}
tiles.put(i, tile);
}
}
public short getBlock(byte x, byte y, byte z) {
HashMap<Byte, Short> tile = tiles.get(y);
short block = tile.get((byte)(x+(z*16)));
return block;
}
}
我正在使用 Windows 任务管理器来监控内存使用情况。 这是一个非常不准确的监控工具吗?它是一种猜测,这可以解释为什么它会因实例而异。
是什么使每个块比应有的重 20 倍?
一个小问题,如果你知道的话:如果我知道我要查找的索引,hashMap 或 ArrayList 更快吗?
【问题讨论】:
-
我不会依赖任务管理器。 AFAIK,JDK 附带一个分析器。
-
啊,好吧。似乎Windows任务管理器非常不准确。但它仍然从 1.30GB 到 1.35GB 不等。你是说 Java 任务控制吧?
-
Java 在启动时使用已经分配给堆的一定数量的内存,系统将其视为非空闲内存。它还会不时运行垃圾收集,并决定何时向系统返回一些内存以及何时分配更多内存。
-
@KaareZ 我从未使用过它,所以我不确定。我看到有人在这里推荐它。我确信在谷歌上搜索“JDK profiler”可以引导你朝着正确的方向前进。
-
windows任务管理器显示java进程分配的内存,但不显示使用了多少堆。如果您使用 -Xms4g -Xmx4g 运行程序,您会看到任务管理器会显示 4gb 的使用量,尽管程序可能是一个空的 main 方法。
标签: java performance memory ram