Jump to content

[Fixed] Potential memory leak


theoriginalbit

Recommended Posts

Link to comment
Share on other sites

Hi

 

When I got this error message, it was because I was sending packets from the client but I hadn't registered a corresponding handler for that packet type on the server.  So the packets weren't being delivered.

 

The way I figured that out was to put a breakpoint in the forge code and look at what the 'this' packet was.

FMLProxyPacket::
processPacket()
                if (internalChannel.writeInbound(this))
                {
                    badPackets.add(this.channel);                                                // BREAKPOINT HERE, AND INSPECT this
                    if (badPackets.size() % packetCountWarning == 0)
                    {
                        FMLLog.severe("Detected ongoing potential memory leak. %d packets have leaked. Top offenders", badPackets.size());
                        int i = 0;
                        for (Entry<String> s  : Multisets.copyHighestCountFirst(badPackets).entrySet())

 

-TGG

Link to comment
Share on other sites

Yeah, I would have thought so.

 

Except - now that I look more closely, perhaps it's not

 

<MessageIronNote.class, MessageIronNote.class> from INSTANCE.registerMessage(MessageIronNote.class, MessageIronNote.class, id++, Side.SERVER);

 

might not be the same as

 

<MessageIronNote, IMessage> from MessageIronNote extends MessageGeneric implements IMessageHandler<MessageIronNote, IMessage>

 

The templates on SimpleNetworkWrapper  caused me serious head damage for a while, still not 100% sure I understand how it works.  Maybe this is a similar problem.

 

-TGG

 

Link to comment
Share on other sites

I don't know if a IMessage can be its own IMessageHandler (I think I saw a pull for this get rejected on github).

 

Rather than having your MessageIronNote class implement IMessageHandler directly, try having a static nested class implement it instead.

public final class MyMessage implements IMessage
{
    //IMessage code
    ...
    
    public static final class Handler implements IMessageHandler<MyMessage, IMessage>
    {
        //Handler code
        ...
    }
}

And registering like this:

INSTANCE.registerMessage(MyMessage.Handler.class, MyMessage.class, id++, Side.SERVER);

BEFORE ASKING FOR HELP READ THE EAQ!

 

I'll help if I can. Apologies if I do something obviously stupid. :D

 

If you don't know basic Java yet, go and follow these tutorials.

Link to comment
Share on other sites

Okay I just discovered my problem and it was the Side.SERVER, it is being sent from the server so it should be Side.CLIENT. though I swear I was getting a crash I'm no longer getting when I used Side.CLIENT. Thank you all for your help! :)

 

Yeah, I would have thought so.

 

Except - now that I look more closely, perhaps it's not

 

<MessageIronNote.class, MessageIronNote.class> from INSTANCE.registerMessage(MessageIronNote.class, MessageIronNote.class, id++, Side.SERVER);

 

might not be the same as

 

<MessageIronNote, IMessage> from MessageIronNote extends MessageGeneric implements IMessageHandler<MessageIronNote, IMessage>

 

The templates on SimpleNetworkWrapper  caused me serious head damage for a while, still not 100% sure I understand how it works.  Maybe this is a similar problem.

 

-TGG

Yeah in the realm of Generics they're definitely the same, MessageIronNote extends MessageGeneric which implements IMessage, so that would be valid. But you do give a good point that I should make things look a little more consistent, thanks.

 

I don't know if a IMessage can be its own IMessageHandler (I think I saw a pull for this get rejected on github).

 

Rather than having your MessageIronNote class implement IMessageHandler directly, try having a static nested class implement it instead.

public final class MyMessage implements IMessage
{
    //IMessage code
    ...
    
    public static final class Handler implements IMessageHandler<MyMessage, IMessage>
    {
        //Handler code
        ...
    }
}

And registering like this:

INSTANCE.registerMessage(MyMessage.Handler.class, MyMessage.class, id++, Side.SERVER);

Yeah I was suggested this change on IRC, while not actually a problem having them together, it might be worth splitting them for me, since I have developed MessageGeneric to be able to handle any packet I ever want to send.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.