当前位置: 首页 > 知识库问答 >
问题:

Bukkit插件内存泄漏

昌栋
2023-03-14

在我的Spigot插件中,我使用重复任务每隔0.5秒更新一次玩家的库存。长时间运行代码后,我会得到java.lang.OutOfMemoryError:GC开销限制超过

我做了一些调试并使用JProfiler来查看导致内存泄漏的原因,并注意到ItemStacks的数量不断增加。堆遍历器显示这是由更新库存的代码引起的。这是当前代码:

public void updateInventory(Collection<? extends Player> players) {
    for (int i = 0; i < guiSize; i++) {
        ItemStack itemStack;
        if (serverItems.containsKey(i)) {
            itemStack = serverItems.get(i);
        } else {
            short color = GLASS_PANE_COLORS[RANDOM.nextInt(GLASS_PANE_COLORS.length - 1)];
            itemStack = new ItemStack(Material.STAINED_GLASS_PANE, 1, color);
            ItemMeta itemMeta = itemStack.getItemMeta();
            itemMeta.setDisplayName(ChatColor.RESET + "");
            itemStack.setItemMeta(itemMeta);
        }

        for (Player player : players) {
            player.getOpenInventory().getTopInventory().setItem(i, itemStack);
        }
    }
}

经过更多的调试,我发现删除了player.getOpenInventory().getTopInventory(。setItem(i,itemStack)将停止增加的itemStack数量。

什么可能导致内存泄漏?

编辑:

我已经更改了代码,不再为每个玻璃窗格制作新的ItemStack。相反,它现在将所有颜色存储在地图中,并从该地图中获取一个ItemStack,以放入库存。这仍然不起作用,服务器将在一段时间后崩溃,并出现OOME。

共有1个答案

龙高超
2023-03-14

给定的代码看起来是正确的,因为它不会导致观察到的内存泄漏。虽然没有显示,但是对预生成ItemStacks的后续修改(一个更好的解决方案)也不会有所贡献。

但是,您是否知道getOpenRetentory()返回玩家当前正在查看的库存,如果没有正在查看,则返回玩家的默认视图,即他们的制作库存?您的方法是否有一个先决条件,即给定集合中的所有玩家都打开了某个库存?如果一个或多个玩家当前正在查看烤箱、分配器等的库存,会发生什么?如果您想始终访问玩家库存,您应该使用getRetentory()

我问是因为否则将物品设置为不同库存的不存在插槽应该会导致其他异常而不是您的 OOM,尽管我不会在 Spigot 或 Minecraft 中为库存边界检查提供凭证。想到可能是这样,我简要地浏览了最新的Spigot-Server代码。没有什么突出会导致内存泄漏。

测试时是否加载了其他插件?如果是,请禁用所有插件,除了您的插件可能依赖的插件。

我希望我能提供更多的洞察力,但我只需要一个代码片段就可以做不了多少事情,这不会花费更长的时间来研究。

 类似资料:
  • 当我试图在我的bukkit服务器中加载插件时,我遇到了NullPointerExc的问题,但在Eclipse中没有错误。我的插件是Rush插件,很多东西没有使用/丢失。错误是这样的: 以下是我的代码:

  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是

  • 问题内容: 我一直在追寻内存泄漏(由“ valgrind –leak-check = yes”报告),它似乎来自ALSA。这段代码已经存在于自由世界中一段时间​​了,所以我猜这是我做错的事情。 输出看起来像这样: 并继续一些页面 这是由于我在一个项目中使用ALSA并开始看到这种巨大的泄漏……或者至少是所说泄漏的报告。 所以问题是:是我,ALSA或valgrind在这里遇到问题吗? 问题答案: ht

  • 问题内容: 我有一个长时间运行的脚本,如果让脚本运行足够长的时间,它将消耗系统上的所有内存。 在不详细介绍脚本的情况下,我有两个问题: 是否有可遵循的“最佳实践”,以防止泄漏发生? 有什么技术可以调试Python中的内存泄漏? 问题答案: 看看这篇文章:跟踪python内存泄漏 另外,请注意,垃圾收集模块实际上可以设置调试标志。看一下功能。此外,请查看Gnibbler的这段代码,以确定调用后已创建

  • 本文向大家介绍Java 内存泄漏,包括了Java 内存泄漏的使用技巧和注意事项,需要的朋友参考一下 在Java中,垃圾回收(析构函数的工作)是使用垃圾回收自动完成的。但是,如果代码中有引用它们的对象怎么办?它无法取消分配,即无法清除其内存。如果这种情况一再发生,并且创建或引用的对象根本没有被使用,它们就会变得无用。这就是所谓的内存泄漏。 如果超过了内存限制,则程序将通过抛出错误(即“ OutOfM

  • 问题内容: 我使用Informix遇到了一个奇怪的问题(具体来说,我使用的是IBM.Data.Informix命名空间,即4.10 Client SDK)。我正在使用ODBC连接到IBM Informix数据库,并且遇到内存泄漏问题。该文档相当稀疏,并且我只能使用当前安装的驱动程序/ SDK。这是我用于数据库上下文的代码: } 我已尝试处置并关闭所有可以的连接,但这似乎无济于事。我是否缺少某些东西