我有一个内存泄漏与字节[],我想了解更多关于此,以防止它发生在未来。如何避免字节[]内存泄漏?
这里是我的Java代码:
package server.world;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class WalkingHandler {
public static final int WIDTH = 12000;
public static final int HEIGHT = 9900;
private final TiledMap map;
private WalkingHandler() {
this.map = new TiledMap(WIDTH, HEIGHT);
}
private static class SingletonContainer {
private static final WalkingHandler SINGLETON = new WalkingHandler();
}
public static WalkingHandler getSingleton() {
return SingletonContainer.SINGLETON;
}
public boolean traversable(int x, int y, int direction) {
int flag = map.getFlag(x, y);
//System.out.println(direction);
if (direction == 0 && (flag == 1 || flag == 4 || flag == 6 || flag == 7 || flag == 9 || flag == 11 || flag == 13 || flag == 14)) {
return false;
} else if (direction == 4 && (flag == 1 || flag == 7 || flag == 15 || flag == 10 || flag == 11 || flag == 12 || flag == 14 || flag == 5)) {
return false;
} else if (direction == 8 && (flag == 1 || flag == 2 || flag == 3 || flag == 4 || flag == 5 || flag == 6 || flag == 7 || flag == 12)) {
return false;
} else if (direction == 12 && (flag == 1 || flag == 3 || flag == 6 || flag == 9 || flag == 10 || flag == 11 || flag == 12 || flag == 8)) {
return false;
} else if(flag > 0 && flag < 15) {
return false;
}
return true;
}
public void initialize() throws Exception {
long delta = System.currentTimeMillis();
RandomAccessFile raf = new RandomAccessFile("data/lolmap.bin", "r");
FileChannel channel = raf.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
int length = buffer.getInt();
for(int i = 0; i < length; i++) {
int x = buffer.getShort();
int y = buffer.getShort();
byte flag = buffer.get();
map.flag(x, y, flag);
}
System.out.println("Loaded clipmap in " + (System.currentTimeMillis() - delta) + "ms.");
}
private static class TiledMap {
private final byte[] plane;
public TiledMap(int width, int height) {
this.plane = new byte[width * 10000 + height];
}
public int getFlag(int x, int y) {
return plane[x * 10000 + y];
}
public void flag(int x, int y, byte flag) {
this.plane[x * 10000 + y] = flag;
}
}
}
请问
有人想替指出我在做什么错误?
请将此代码粘贴到此处,而不是链接到pastebin上。 –
@Aleksandr:你实例化你的TiledMap多少次?除此之外,“x * 10000 + y”是违反直觉的。大多数游戏设计师都会使用“y * 1000 + x”在包含2D事物的1维数组中存储/定位“事物”。另外,如果方向/标志*东西可以肯定地以更好的方式重写,那么你的杂乱*。 – SyntaxT3rr0r
你在找什么内存泄漏?你分配内存并使用它。只要你不需要任何其他的内存,就算我没有看到,它也不会被垃圾收集,即使它没有被引用,所有的内存都在你的情况下。所以请解释一下,如果你需要帮助,你会在哪里看到哪个问题。 –