packetevents icon indicating copy to clipboard operation
packetevents copied to clipboard

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

Open DreamVoid opened this issue 1 year ago • 11 comments

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

DreamVoid avatar Jun 28 '24 07:06 DreamVoid

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

booky10 avatar Jun 28 '24 10:06 booky10

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) ~[?:?]

DreamVoid avatar Jun 28 '24 10:06 DreamVoid

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

SquidXTV avatar Jun 28 '24 20:06 SquidXTV

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

DreamVoid avatar Jun 28 '24 23:06 DreamVoid

Nice comment and please rewatch my issue

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

SquidXTV avatar Jun 29 '24 08:06 SquidXTV

Has been fixed in the development builds.

retrooper avatar Jun 30 '24 05:06 retrooper

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"]

DreamVoid avatar Jun 30 '24 05:06 DreamVoid

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

AbhigyaKrishna avatar Jun 30 '24 07:06 AbhigyaKrishna

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.

DreamVoid avatar Jun 30 '24 07:06 DreamVoid

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.

AbhigyaKrishna avatar Jun 30 '24 07:06 AbhigyaKrishna

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

retrooper avatar Jun 30 '24 22:06 retrooper

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

AbhigyaKrishna avatar Jul 09 '24 16:07 AbhigyaKrishna

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

It works well, thanks for your work.

DreamVoid avatar Jul 11 '24 03:07 DreamVoid