gpt4 book ai didi

java - 如何避免 byte[] 内存泄漏?

转载 作者:行者123 更新时间:2023-11-30 09:46:27 25 4
gpt4 key购买 nike

我有 byte[] 的内存泄漏,我想了解更多相关信息以防止它在未来发生。

这是我的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;
}

}

}

有人介意指出我做错了什么吗?

最佳答案

您正在创建一个大小为 12000*10000+9900 的数组,即 120_009_900 字节(这甚至是错误的初始化:您应该分配 12000*9900 空间并使用 x*height+y 获取它们)

private static class TiledMap {

private final byte[] plane;
private final int width,height;

public TiledMap(int width, int height) {
this.plane = new byte[width * height];
this.width = width;
this.height = height;
}

public int getFlag(int x, int y) {
return plane[x * height + y];
}

public void flag(int x, int y, byte flag) {
this.plane[x * height + y] = flag;
}

}

但是你最好先从文件中获取你需要多少空间,然后再分配

关于java - 如何避免 byte[] 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7139130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com