Memory leak.

Версия Minecraft
1.7.10
212
8
29
Как с этим бороться?
[11:45:37] [Server thread/ERROR] [FML]: Detected ongoing potential memory leak. 900 packets have leaked. Top offenders
[11:45:37] [Server thread/ERROR] [FML]: ssHSch : 900

Java:
@ChannelHandler.Sharable
public class PacketPipeline extends MessageToMessageCodec<FMLProxyPacket, AbstractPacket>
{
    private EnumMap<Side, FMLEmbeddedChannel> channels;
    private LinkedList<Class<? extends AbstractPacket>> packets           = Lists.newLinkedList();
    private boolean                                     isPostInitialised = false;


    public boolean registerPacket(Class<? extends AbstractPacket> clazz)
    {
        if (this.packets.size() > 256 | this.packets.contains(clazz) | this.isPostInitialised)
        {
            return false;
        }

        this.packets.add(clazz);
        return true;
    }

    public void initialise() {
        this.channels = NetworkRegistry.INSTANCE.newChannel("ssHSch", new ChannelHandler[]{this});
        this.registerPacket(KeyPacket.class);
        this.registerPacket(AnchorPullPacket.class);
        this.registerPacket(FuelPacket.class);
        this.registerPacket(DistPacket.class);
        this.registerPacket(EntityPullPacket.class);
        this.registerPacket(AnchorSPacket.class);
    }



    public void postInit()
    {
        if (this.isPostInitialised)
        {
            return;
        }

        this.isPostInitialised = true;
        Collections.sort(this.packets, new Comparator<Class<? extends AbstractPacket>>()
        {
            @Override
            public int compare(Class<? extends AbstractPacket> clazz1, Class<? extends AbstractPacket> clazz2)
            {
                int com = String.CASE_INSENSITIVE_ORDER.compare(clazz1.getCanonicalName(), clazz2.getCanonicalName());
                if (com == 0)
                {
                    com = clazz1.getCanonicalName().compareTo(clazz2.getCanonicalName());
                }
                return com;
            }
        });
    }


    @Override
    protected void encode(ChannelHandlerContext ctx, AbstractPacket msg, List<Object> out) throws Exception
    {
        ByteBuf buffer = Unpooled.buffer();
        Class<? extends AbstractPacket> clazz = msg.getClass();
        if (!this.packets.contains(msg.getClass()))
        {
            throw new NullPointerException("No Packet Registered for: " + msg.getClass().getCanonicalName());
        }

        byte discriminator = (byte) this.packets.indexOf(clazz);
        buffer.writeByte(discriminator);
        msg.encodeInto(ctx, buffer);
        FMLProxyPacket proxyPacket = new FMLProxyPacket(buffer.copy(), ctx.channel().attr(NetworkRegistry.FML_CHANNEL).get());
        out.add(proxyPacket);
    }


    @Override
    protected void decode(ChannelHandlerContext ctx, FMLProxyPacket msg, List<Object> out) throws Exception
    {
        ByteBuf payload = msg.payload();
        byte discriminator = payload.readByte();
        Class<? extends AbstractPacket> clazz = this.packets.get(discriminator);
        if (clazz == null)
        {
            throw new NullPointerException("No packet registered for discriminator: " + discriminator);
        }

        AbstractPacket pkt = clazz.newInstance();
        pkt.decodeInto(ctx, payload.slice());

        EntityPlayer player;
        switch (FMLCommonHandler.instance().getEffectiveSide())
        {
            case CLIENT:
                player = this.getClientPlayer();
                pkt.handleClientSide(player);
                break;

            case SERVER:
                INetHandler netHandler = ctx.channel().attr(NetworkRegistry.NET_HANDLER).get();
                player = ((NetHandlerPlayServer)netHandler).playerEntity;
                pkt.handleServerSide(player);
                break;

            default:
        }

        out.add(pkt);
    }

    @SideOnly(Side.CLIENT)
    private EntityPlayer getClientPlayer()
    {
        return Minecraft.getMinecraft().thePlayer;
    }


    public void sendToAll(AbstractPacket message) {
        this.channels.get((Object)Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set((OutboundTarget)FMLOutboundHandler.OutboundTarget.ALL);
        this.channels.get((Object)Side.SERVER).writeAndFlush((Object)message);
    }

    public void sendTo(AbstractPacket message, EntityPlayerMP player) {
        this.channels.get((Object)Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set((OutboundTarget)FMLOutboundHandler.OutboundTarget.PLAYER);
        this.channels.get((Object)Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set((Object)player);
        this.channels.get((Object)Side.SERVER).writeAndFlush((Object)message);
    }

    public void sendToAllAround(AbstractPacket message, NetworkRegistry.TargetPoint point) {
        this.channels.get((Object)Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set((OutboundTarget)FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT);
        this.channels.get((Object)Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set((Object)point);
        this.channels.get((Object)Side.SERVER).writeAndFlush((Object)message);
    }

    public void sendToDimension(AbstractPacket message, int dimensionId) {
        this.channels.get((Object)Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set((OutboundTarget)FMLOutboundHandler.OutboundTarget.DIMENSION);
        this.channels.get((Object)Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set((Object)dimensionId);
        this.channels.get((Object)Side.SERVER).writeAndFlush((Object)message);
    }

    public void sendToServer(AbstractPacket message) {
        this.channels.get((Object)Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set((OutboundTarget)FMLOutboundHandler.OutboundTarget.TOSERVER);
        this.channels.get((Object)Side.CLIENT).writeAndFlush((Object)message);
    }

}
Java:
public class KeyPacket
extends AbstractPacket {
    private List<Integer> keyData = new ArrayList<Integer>();

    public KeyPacket() {
    }

    public KeyPacket(List<Integer> keys) {
        this.keyData = keys;
    }

    @Override
    public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
        buffer.writeInt(this.keyData.size());
        for (int i = 0; i < this.keyData.size(); ++i) {
            buffer.writeInt(this.keyData.get(i).intValue());
        }
    }

    @Override
    public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
        int c = buffer.readInt();
        for (int i = 0; i < c; ++i) {
            this.keyData.add(buffer.readInt());
        }
    }

    @Override
    public void handleClientSide(EntityPlayer player) {
    }

    @Override
    public void handleServerSide(EntityPlayer player) {
        DataManager.setKeyData(player, this.keyData);
    }
}
Java:
public class DistPacket
extends AbstractPacket {
    double dist;
    int side;

    public DistPacket() {
    }

    public DistPacket(double fuel, int side) {
        this.dist = fuel;
        this.side = side;
    }

    @Override
    public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
        buffer.writeDouble(this.dist);
        buffer.writeInt(this.side);
    }

    @Override
    public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
        this.dist = buffer.readDouble();
        this.side = buffer.readInt();
    }

    @Override
    public void handleClientSide(EntityPlayer player) {
    }

    @Override
    public void handleServerSide(EntityPlayer player) {
        Entity e = null;
        if (this.side == 0) {
            if (ItemMoveLeggings.rightAnchorMap.containsKey((Object)player)) {
                e = (Entity)ItemMoveLeggings.rightAnchorMap.get((Object)player);
            }
        } else if (this.side == 1 && ItemMoveLeggings.leftAnchorMap.containsKey((Object)player)) {
            e = (Entity)ItemMoveLeggings.leftAnchorMap.get((Object)player);
        }
        if (e != null) {
            ((EntityAnchor)e).dist = this.dist != 0.0 ? (((EntityAnchor)e).dist += this.dist) : (double)player.getDistanceToEntity(e);
        }
    }
}
Если, что-то надо будет докинуть, докину.
 
Сверху