retrooper / packetevents

PacketEvents is emerging as a strong contender in the realm of Minecraft packet processing libraries. Designed to simplify packet manipulation while delivering high performance, this powerful tool aims to demystify the complexities of projects utilizing packets.
GNU General Public License v3.0
519 stars 148 forks source link

1.12.2 Spigot memory leak `java.lang.OutOfMemoryError: Java heap space` #857

Closed DreamVoid closed 2 months ago

DreamVoid commented 3 months ago

Describe the bug

...server loading without errors...
[15:36:03 INFO]: [packetevents] Loading packetevents v2.3.0
[15:36:08 ERROR]: [org.bukkit.craftbukkit.v1_12_R1.CraftServer] Java heap space initializing packetevents v2.3.0 (Is it up to date?)
java.lang.OutOfMemoryError: Java heap space
        at java.io.DataInputStream.readUTF(Unknown Source) ~[?:?]
        at java.io.DataInputStream.readUTF(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$429/0x00007f983073a590.readName(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTagName(NBTSerializer.java:107) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$22(DefaultNBTSerializer.java:97) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$453/0x00007f9830778678.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:115) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$24(DefaultNBTSerializer.java:121) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$455/0x00007f9830778ad8.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:115) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$22(DefaultNBTSerializer.java:97) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$453/0x00007f9830778678.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:115) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$24(DefaultNBTSerializer.java:121) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$455/0x00007f9830778ad8.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:115) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$22(DefaultNBTSerializer.java:97) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$453/0x00007f9830778678.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:115) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.deserializeTag(NBTSerializer.java:61) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.deserializeTag(NBTSerializer.java:50) ~[?:?]
        at com.github.retrooper.packetevents.util.mappings.MappingHelper.decompress(MappingHelper.java:41) ~[?:?]
        at com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState.loadModern(WrappedBlockState.java:261) ~[?:?]
        at com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState.<clinit>(WrappedBlockState.java:41) ~[?:?]
        at io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder$1.load(SpigotPacketEventsBuilder.java:105) ~[?:?]
        at io.github.retrooper.packetevents.PacketEventsPlugin.onLoad(PacketEventsPlugin.java:40) ~[?:?]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.loadPlugins(CraftServer.java:326) ~[patched_1.12.2.jar:git-Dionysus-"8d3095e"]
        at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:226) ~[patched_1.12.2.jar:git-Dionysus-"8d3095e"]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:630) ~[patched_1.12.2.jar:git-Dionysus-"8d3095e"]
        at java.lang.Thread.run(Unknown Source) ~[?:?]

...server continue loading without errors except plugins that depends on packetevents, such as Matrix...

Software brand Dinoysus 1.12.2

Plugins image

How To Reproduce

  1. Download packetevents 2.3.0 from github and install it.
  2. Start server.
  3. java.lang.OutOfMemoryError: Java heap space

Expected behavior Memory should not be leaked

Screenshots No need more screenshots

Additional context The server running on Java 17 and allocated 256MB of memory. Other plugins works well. When allocated 1GB memory, process will take 1,100 MB(without packetevents installed it only take less 200MB) and start normally while no player joined

booky10 commented 3 months ago

Please try the latest jenkins build and test if the problem persists

DreamVoid commented 3 months ago

Please try the latest jenkins build and test if the problem persists

Still

18:59:18 INFO]: [packetevents] Loading packetevents v2.3.1-SNAPSHOT
[18:59:22 ERROR]: [org.bukkit.craftbukkit.v1_12_R1.CraftServer] Java heap space initializing packetevents v2.3.1-SNAPSHOT (Is it up to date?)
java.lang.OutOfMemoryError: Java heap space
        at java.util.LinkedHashMap.newNode(Unknown Source) ~[?:?]
        at java.util.HashMap.putVal(Unknown Source) ~[?:?]
        at java.util.HashMap.put(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.NBTCompound.setTag(NBTCompound.java:195) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$22(DefaultNBTSerializer.java:141) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$449/0x00007fef7c7ba4b8.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$20(DefaultNBTSerializer.java:118) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$447/0x00007fef7c7ba058.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$22(DefaultNBTSerializer.java:139) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$449/0x00007fef7c7ba4b8.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$20(DefaultNBTSerializer.java:118) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$447/0x00007fef7c7ba058.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$22(DefaultNBTSerializer.java:139) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$449/0x00007fef7c7ba4b8.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.deserializeTag(NBTSerializer.java:62) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.deserializeTag(NBTSerializer.java:51) ~[?:?]
        at com.github.retrooper.packetevents.util.mappings.MappingHelper.decompress(MappingHelper.java:42) ~[?:?]
        at com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState.loadModern(WrappedBlockState.java:278) ~[?:?]
        at com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState.<clinit>(WrappedBlockState.java:53) ~[?:?]
        at io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder$1.load(SpigotPacketEventsBuilder.java:105) ~[?:?]
        at io.github.retrooper.packetevents.PacketEventsPlugin.onLoad(PacketEventsPlugin.java:40) ~[?:?]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.loadPlugins(CraftServer.java:326) ~[patched_1.12.2.jar:git-Dionysus-"8d3095e"]
        at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:226) ~[patched_1.12.2.jar:git-Dionysus-"8d3095e"]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:630) ~[patched_1.12.2.jar:git-Dionysus-"8d3095e"]
        at java.lang.Thread.run(Unknown Source) ~[?:?]
SquidXTV commented 3 months ago

I couldn't reproduce. Memory jumps from ~300MB to 600MB usage without/with packetevents. (Building latest version of 2.0 branch)

DreamVoid commented 3 months ago

I couldn't reproduce. Memory jumps from ~300MB to 600MB usage without/with packetevents. (Building latest version of 2.0 branch)

“600MB”

Nice comment and please rewatch my issue

SquidXTV commented 3 months ago

Nice comment and please rewatch my issue

I am saying like that more ram usage doesn't automatically indicate a memory leak.

retrooper commented 3 months ago

Has been fixed in the development builds.

DreamVoid commented 3 months ago

Has been fixed in the development builds.

When is the stable version ETA?

[13:26:47 INFO]: [packetevents] Loading packetevents v2.4.0-SNAPSHOT
[13:26:51 ERROR]: [org.bukkit.craftbukkit.v1_12_R1.CraftServer] Java heap space initializing packetevents v2.4.0-SNAPSHOT (Is it up to date?)
java.lang.OutOfMemoryError: Java heap space
        at java.lang.StringUTF16.compress(Unknown Source) ~[?:?]
        at java.lang.String.<init>(Unknown Source) ~[?:?]
        at java.lang.String.<init>(Unknown Source) ~[?:?]
        at java.io.DataInputStream.readUTF(Unknown Source) ~[?:?]
        at java.io.DataInputStream.readUTF(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$1(DefaultNBTSerializer.java:41) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$427/0x00007fb1607c17d8.readName(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTagName(NBTSerializer.java:108) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$22(DefaultNBTSerializer.java:138) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$449/0x00007fb1607cf3b0.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$20(DefaultNBTSerializer.java:118) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$447/0x00007fb1607cef50.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$22(DefaultNBTSerializer.java:139) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$449/0x00007fb1607cf3b0.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$20(DefaultNBTSerializer.java:118) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$447/0x00007fb1607cef50.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer.lambda$new$22(DefaultNBTSerializer.java:139) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.DefaultNBTSerializer$$Lambda$449/0x00007fb1607cf3b0.readTag(Unknown Source) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.readTag(NBTSerializer.java:116) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.deserializeTag(NBTSerializer.java:62) ~[?:?]
        at com.github.retrooper.packetevents.protocol.nbt.serializer.NBTSerializer.deserializeTag(NBTSerializer.java:51) ~[?:?]
        at com.github.retrooper.packetevents.util.mappings.MappingHelper.decompress(MappingHelper.java:42) ~[?:?]
        at com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState.loadModern(WrappedBlockState.java:278) ~[?:?]
        at com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState.<clinit>(WrappedBlockState.java:53) ~[?:?]
        at io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder$1.load(SpigotPacketEventsBuilder.java:105) ~[?:?]
        at io.github.retrooper.packetevents.PacketEventsPlugin.onLoad(PacketEventsPlugin.java:40) ~[?:?]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.loadPlugins(CraftServer.java:326) ~[patched_1.12.2.jar:git-Dionysus-"8d3095e"]
        at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:226) ~[patched_1.12.2.jar:git-Dionysus-"8d3095e"]
AbhigyaKrishna commented 3 months ago

PE needs a fair amount of ram to load everything up. The stacktrace doesn't indicate any memory leak.

DreamVoid commented 3 months ago

PE needs a fair amount of ram to load everything up. The stacktrace doesn't indicate any memory leak.

So, why does such a plugin need to create so many instances during loading state to keep running?

I have never seen an out of memory error in the past years, and this is the first time.

If this is intentional, and I have to allocate meaningless memory on a server that is not used for normal games just for such a plugin that consumes a lot of memory, then I can only consider not using this plugin.
AbhigyaKrishna commented 3 months ago

Plugins or applications in general need data to perform task. PE contains version specific mapping file to function. All the extra overhead is cleared after all the mapping files loads up.

retrooper commented 3 months ago

An improvement is being worked on by @AbhigyaKrishna to keep the memory usage at a low during this loading of mappings.

AbhigyaKrishna commented 2 months ago

Mappings loading are now optimized. Try using the latest version of packetevents and check the results.

DreamVoid commented 2 months ago

Mappings loading are now optimized. Try using the latest version of packetevents and check the results.

It works well, thanks for your work.