检查数组中的空空间时发生Java内存泄漏

检查数组中的空空间时发生Java内存泄漏,java,arrays,memory,memory-leaks,minecraft,Java,Arrays,Memory,Memory Leaks,Minecraft,哦,天哪,垃圾收集器。 我遇到了一个java outOfMemory错误 堆栈跟踪: [09:44:10] 2014-01-22 09:44:10 [INFO] [STDERR] java.lang.OutOfMemoryError: Java heap space [09:44:11] 2014-01-22 09:44:10 [INFO] [STDERR] at net.minecraft.util.AABBPool.getAABB(AABBPool.java:50) [09:44:11]

哦,天哪,垃圾收集器。 我遇到了一个java outOfMemory错误

堆栈跟踪:

[09:44:10] 2014-01-22 09:44:10 [INFO] [STDERR] java.lang.OutOfMemoryError: Java heap space
[09:44:11] 2014-01-22 09:44:10 [INFO] [STDERR]  at net.minecraft.util.AABBPool.getAABB(AABBPool.java:50)
[09:44:11] 2014-01-22 09:44:11 [INFO] [STDERR]  at net.minecraft.block.Block.getCollisionBoundingBoxFromPool(Block.java:602)
[09:44:12] 2014-01-22 09:44:12 [INFO] [STDERR]  at net.minecraft.block.Block.addCollisionBoxesToList(Block.java:568)
[09:44:14] 2014-01-22 09:44:14 [INFO] [STDERR]  at net.minecraft.world.World.getCollidingBoundingBoxes(World.java:1684)
[09:44:15] 2014-01-22 09:44:14 [INFO] [STDERR]  at net.minecraft.entity.player.EntityPlayerMP.<init>(EntityPlayerMP.java:187)
[09:44:17] 2014-01-22 09:44:15 [INFO] [STDERR]  at net.minecraft.server.management.ServerConfigurationManager.createPlayerForUser(ServerConfigurationManager.java:389)
[09:44:18] 2014-01-22 09:44:17 [INFO] [STDERR]  at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:91)
[09:44:19] 2014-01-22 09:44:18 [INFO] [STDERR]  at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:691)
[09:44:20] 2014-01-22 09:44:19 [INFO] [STDERR]  at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:587)
[09:44:22] 2014-01-22 09:44:20 [INFO] [STDERR]  at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:129)
[09:44:23] 2014-01-22 09:44:22 [INFO] [STDERR]  at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:484)
[09:44:24] 2014-01-22 09:44:23 [INFO] [STDERR]  at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
[09:44:33] 2014-01-22 09:44:24 [SEVERE] [Minecraft-Server] Encountered an unexpected exception OutOfMemoryError
[09:44:33] java.lang.OutOfMemoryError: Java heap space
[09:44:33]  at net.minecraft.util.AABBPool.getAABB(AABBPool.java:50)
[09:44:33]  at net.minecraft.block.Block.getCollisionBoundingBoxFromPool(Block.java:602)
[09:44:33]  at net.minecraft.block.Block.addCollisionBoxesToList(Block.java:568)
[09:44:33]  at net.minecraft.world.World.getCollidingBoundingBoxes(World.java:1684)
[09:44:33]  at net.minecraft.entity.player.EntityPlayerMP.<init>(EntityPlayerMP.java:187)
[09:44:33]  at net.minecraft.server.management.ServerConfigurationManager.createPlayerForUser(ServerConfigurationManager.java:389)
[09:44:33]  at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:91)
[09:44:33]  at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:691)
[09:44:33]  at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:587)
[09:44:33]  at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:129)
[09:44:33]  at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:484)
[09:44:33]  at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
然后再次通过super调用此函数:

public Block(int par1, Material par2Material)
{
    this.stepSound = soundPowderFootstep;
    this.blockParticleGravity = 1.0F;
    this.slipperiness = 0.6F;

    if (blocksList[par1] != null)
    {
        throw new IllegalArgumentException("Slot " + par1 + " is already occupied by " + blocksList[par1] + " when adding " + this);
    }
    else
    {
        this.blockMaterial = par2Material;
        blocksList[par1] = this;
        this.blockID = par1;
        this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
        opaqueCubeLookup[par1] = this.isOpaqueCube();
        lightOpacity[par1] = this.isOpaqueCube() ? 255 : 0;
        canBlockGrass[par1] = !par2Material.getCanBlockGrass();
    }
}


在AABBPool第50行中:

44    public AxisAlignedBB getAABB(double par1, double par3, double par5, double par7, double par9, double par11)
45    {
46        AxisAlignedBB axisalignedbb;
47
48        if (this.nextPoolIndex >= this.listAABB.size())
49        {
50            axisalignedbb = new AxisAlignedBB(par1, par3, par5, par7, par9, par11);
51           this.listAABB.add(axisalignedbb);
52        }
53        else
54        {
55            axisalignedbb = (AxisAlignedBB)this.listAABB.get(this.nextPoolIndex);
56            axisalignedbb.setBounds(par1, par3, par5, par7, par9, par11);
57        }
58
59        ++this.nextPoolIndex;
60        return axisalignedbb;
61    }
在块行602中:

600    public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
601    {
602        return AxisAlignedBB.getAABBPool().getAABB((double)par2 + this.minX, (double)par3 + this.minY, (double)par4 + this.minZ, (double)par2 + this.maxX, (double)par3 + this.maxY, (double)par4 + this.maxZ);
603    }
如果你需要更多的信息,就说出来。
谢谢您的帮助。

乍一看,您的问题不在于函数在块列表中查找间隙,而是您构建的每个块都会在该列表和游戏注册表中被引用

当您尝试释放一个块时,这些引用中的一个可能以某种方式持续存在,这会阻止GC擦除其内存,并导致您的泄漏。。。这只是个想法,请检查一下


请查看有关内存泄漏的进一步解释

该函数不分配内存*,因此它不能成为OOM异常的来源*从技术上讲,它只在堆栈上分配一个4字节的int。它扮演着巨大的角色,因为注释掉它将不再导致内存泄漏。。我将在实际堆栈跟踪中添加更多的代码。它正在调用超类“
ModBlock
方法-您在编辑中是否键入了错误的名称?请向我们展示
net.minecraft.util.AABBPool.getAABB(AABBPool.java:50)
。我在游戏注册表中没有找到任何东西,所以我猜它一定在代码中的其他地方。尽管如果问题出在我没有编写的代码中,那么修改代码可能会导致mod之间的不兼容。因此,我必须回到使用计数器的方法,如果可能的话,也许你只需要在释放一个块时,从游戏注册表中“注销”它,并在块列表中的位置分配一个空值,再次创建一个间隙。如果“unregister”方法存在并且是干净的,那么它应该让GC明白它必须清理块。不幸的是,
cpw.mods.fml.common.registry.*
中没有这样的函数。此外,如果我将blocks列表设置为null,它不会尝试创建一个具有重复id的块吗?寻找间隙并不是问题,因为程序启动得很好。你应该确保一旦你认为没有必要,你就把你存储在你的应用程序中的每一个引用都设置为空。如果这些引用仍然存在,这就是java中内存泄漏的定义,如答案中的示例所示。一旦你确定你的代码中没有更多的引用,就考虑一下“<代码> GAMEGIGRESION/<代码>引用了你的<代码>块< /代码>,如果你不能修复它,就向代码所有者提交一个bug或一些东西,这是一个非常好的主意。我一定要通知Forge API开发人员。他们应该最了解整件事。奇怪的是我之前没有这个想法。现在我还是像以前一样有一个柜台。
public Block(int par1, Material par2Material)
{
    this.stepSound = soundPowderFootstep;
    this.blockParticleGravity = 1.0F;
    this.slipperiness = 0.6F;

    if (blocksList[par1] != null)
    {
        throw new IllegalArgumentException("Slot " + par1 + " is already occupied by " + blocksList[par1] + " when adding " + this);
    }
    else
    {
        this.blockMaterial = par2Material;
        blocksList[par1] = this;
        this.blockID = par1;
        this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
        opaqueCubeLookup[par1] = this.isOpaqueCube();
        lightOpacity[par1] = this.isOpaqueCube() ? 255 : 0;
        canBlockGrass[par1] = !par2Material.getCanBlockGrass();
    }
}
44    public AxisAlignedBB getAABB(double par1, double par3, double par5, double par7, double par9, double par11)
45    {
46        AxisAlignedBB axisalignedbb;
47
48        if (this.nextPoolIndex >= this.listAABB.size())
49        {
50            axisalignedbb = new AxisAlignedBB(par1, par3, par5, par7, par9, par11);
51           this.listAABB.add(axisalignedbb);
52        }
53        else
54        {
55            axisalignedbb = (AxisAlignedBB)this.listAABB.get(this.nextPoolIndex);
56            axisalignedbb.setBounds(par1, par3, par5, par7, par9, par11);
57        }
58
59        ++this.nextPoolIndex;
60        return axisalignedbb;
61    }
600    public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
601    {
602        return AxisAlignedBB.getAABBPool().getAABB((double)par2 + this.minX, (double)par3 + this.minY, (double)par4 + this.minZ, (double)par2 + this.maxX, (double)par3 + this.maxY, (double)par4 + this.maxZ);
603    }