Skip to content

Commit 4f184db

Browse files
authored
Fix memory leak on constantly damage (#13455)
1 parent 57d84f6 commit 4f184db

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

paper-server/patches/sources/net/minecraft/world/damagesource/CombatTracker.java.patch

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
--- a/net/minecraft/world/damagesource/CombatTracker.java
22
+++ b/net/minecraft/world/damagesource/CombatTracker.java
3-
@@ -29,15 +_,24 @@
3+
@@ -22,22 +_,40 @@
4+
private static final Style INTENTIONAL_GAME_DESIGN_STYLE = Style.EMPTY
5+
.withClickEvent(new ClickEvent.OpenUrl(CommonLinks.INTENTIONAL_GAME_DESIGN_BUG))
6+
.withHoverEvent(new HoverEvent.ShowText(Component.literal("MCPE-28723")));
7+
- public final List<CombatEntry> entries = Lists.newArrayList();
8+
+ public final List<CombatEntry> entries = new net.minecraft.util.ArrayListDeque<>(); // Paper - Fix mem leak (MC-301114); Use ArrayListDeque
9+
public final LivingEntity mob;
10+
private int lastDamageTime;
11+
private int combatStartTime;
412
private int combatEndTime;
513
public boolean inCombat;
614
public boolean takingDamage;
@@ -22,6 +30,15 @@
2230
+ public void recordDamageAndCheckCombatState(final CombatEntry entry) {
2331
+ final DamageSource source = entry.source();
2432
+ // Paper end - Combat tracker API
33+
+ // Paper start - Fix mem leak (MC-301114)
34+
+ final io.papermc.paper.configuration.type.number.IntOr.Disabled maxTrackingCombatEntries;
35+
+ if (!this.entries.isEmpty() && (maxTrackingCombatEntries = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxTrackingCombatEntries).enabled()) {
36+
+ final int maxEntries = maxTrackingCombatEntries.intValue();
37+
+ while (this.entries.size() > maxEntries) {
38+
+ this.entries.removeFirst();
39+
+ }
40+
+ }
41+
+ // Paper end - Fix mem leak (MC-301114)
2542
this.entries.add(entry);
2643
this.lastDamageTime = this.mob.tickCount;
2744
this.takingDamage = true;

paper-server/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.papermc.paper.configuration;
22

33
import com.mojang.logging.LogUtils;
4-
import io.papermc.paper.FeatureHooks;
54
import io.papermc.paper.configuration.constraint.Constraints;
65
import io.papermc.paper.configuration.serializer.collection.map.WriteKeyBack;
76
import io.papermc.paper.configuration.type.number.DoubleOr;
@@ -335,6 +334,8 @@ private void postProcess() {
335334
public boolean enableNether = true;
336335
@Comment("Keeps Paper's fix for MC-159283 enabled. Disable to use vanilla End ring terrain.")
337336
public boolean fixFarEndTerrainGeneration = true;
337+
@Comment("Fix for MC-301114. This removes the oldest combat entry when it hits the cap, to fix a memory leak on constant entity damage.")
338+
public IntOr.Disabled maxTrackingCombatEntries = new IntOr.Disabled(OptionalInt.of(10240));
338339
}
339340

340341
public BlockUpdates blockUpdates;

0 commit comments

Comments
 (0)