Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

I am getting a potential memory leak detected when I was porting to my mod to the latest version. I cannot for the life of me figure out why.

 

Log output: http://pastebin.com/UHudKSSP

Networking code: https://github.com/theoriginalbit/MoarPeripherals/tree/master/src/main/java/com/theoriginalbit/moarperipherals/common/network

Sending the message: https://github.com/theoriginalbit/MoarPeripherals/blob/master/src/main/java/com/theoriginalbit/moarperipherals/common/tile/TileIronNote.java#L45

  • Author

thank you, while that is an excellent catch that I missed (and will definitely keep in), I'm still getting the exact same issue, every 5 seconds it states the memory leak.

  • Author

I changed to use the ByteBufUtils, but since the NBT code is actually never called — the offending packet only uses int data — the stream should never be opened for the NBT read/write, meaning it isn't the cause of the leak.

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

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

 

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.

  • Author

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.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.