gpt4 book ai didi

java - 从 HashMap 中删除对象时程序挂起?

转载 作者:行者123 更新时间:2023-11-30 08:14:31 25 4
gpt4 key购买 nike

我为 Minecraft 服务器开发插件。最近在我的测试服务器上,我在从 ArrayList 或 Hashmap 中删除对象时反复崩溃。

首先,它看起来只是从 ArrayList 中删除了一些东西。但是,它现在似乎能够在从任何 ArrayList/HashMap 中删除某些内容时随机发生。

在此特定实例中,代码行是 entlist.get(pl.getName()).remove(en);周围的代码是

for (LivingEntity en: remove) {
i++;
if (entlist.containsKey(pl.getName())) {
entlist.get(pl.getName()).remove(en);
}
if (i > 2000) {
try {
throw new Exception("Too many entities to remove!!");
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}

entlist 是一个 HashMap<String, ArrayList<LivingEntity>> entlist = new HashMap<String, ArrayList<LivingEntity>>(); .

胎面转储特别列出了 ArrayList#remove()作为问题。

[09:53:51 ERROR]: Current Thread: Server thread
[09:53:51 ERROR]: PID: 14 | Suspended: false | Native: false | State: RUNN
ABLE
[09:53:51 ERROR]: Stack:
[09:53:51 ERROR]: java.util.ArrayList.remove(ArrayList.java:481)
[09:53:51 ERROR]: a.e$4.run(Main.java:1786) //Line 1786 being the `entlist.get(pl.getName()).remove(en);` line from earlier.

Java 版本:

C:\WINDOWS\system32>java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) Client VM (build 23.6-b04, mixed mode, sharing)

另外由于评论中有人问,I've pastebinned the entire thread dump that Spigot puts out当它检测到卡住时。

为什么简单地从 ArrayList/HashMap 中删除一个值会卡住整个服务器?

最佳答案

不完全清楚 ArrayList 的第 481 行是什么,但假设它是 this one ,很难看出 ArrayList.remove(...) 调用是如何“卡住”的。

我有两个理论:

  • 某些东西正在对 ArrayList 执行更新,但未正确同步。这可能会导致另一个线程看到 ArrayList 的陈旧/不一致状态,从而导致不可预测的行为。这可能足以将remove 操作置于无限循环中,但具体如何操作尚不明显。

    也可能是未同步的 HashMap 更新。

  • 应用程序一点也不卡。相反,它花费了很长的时间 ...因为您有一个非常大的数据结构和/或一个非常昂贵的equals 操作。

    您可以通过查看数据结构的大小和/或测量和记录该部分代码所花费的时间来(部分)测试该理论。

关于java - 从 HashMap 中删除对象时程序挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29455829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com