请前往 模块插件 激活 UI Manage 然后刷新
旋律工艺云计算

技术支持

  1. 门户首页
  2. 帮助中心
  3. 我的世界面板服教程区
  4. 为什么我的服务器显示内存使用率接近100%,这正常吗?
用户登录
帮助中心

为什么我的服务器显示内存使用率接近100%,这正常吗?

Java程序是使用JVM虚拟机来运行的 启动参数中的Xms和Xmx控制JVM虚拟机的最大内存和最小内存,默认情况下 JVM 虚拟机会根据程序的实际需求 占用比实际需求更大内存, 使用优化参数会导致一直占用全部内存

内存被占用后不一定是使用了 而有可能只是被JVM占用 程序没有实际使用 所以当您看到服务器面板显示内存占用接近100%不用非常担心 不会发生什么糟糕的情况。

Java 是一种垃圾收集语言,这意味着它只会在用完时清理未使用的内存。此过程可能需要很长时间,并且需要您的服务器暂时锁定。因此,Java 喜欢尽可能不频繁地运行此过程,以减少这些延迟峰值的频率。因此,您可能会看到服务器的内存使用率很高,即使您的服务器的内存使用率实际上并没有那么高。

 

旋律云简单解释: 面板上显示的内存占用率仅供参考 不代表mc服务端实际使用的内存 如果需要知道mc服务端实际使用内存 需要安装相关插件 如Spark Ess carpet等。

如果您使用优化参数的核心 占用的内存会一直接近100% 这没有问题 不必惊慌失措

 

专业解释: 来源:https://docs.pufferfish.host/general/why-is-my-ram-all-used/

怎么知道我是否需要更多 RAM?

检查内存使用情况的最佳方法是安装Spark插件。这是一个常用的插件,可帮助您检查服务器的性能并找出延迟的原因。在这种情况下,我们将使用它来确定您的服务器是否真的需要更多内存。有几件事可以表明您的服务器内存不足并且需要更多内存。

在您的服务器上安装 Spark 后,运行命令/spark healthreport --memory。此命令将显示一些统计信息。您主要感兴趣的数字是G1 Old Gen pool usage。此数字将显示您的服务器选择长期保留多少内存。您的目标应该是将此数字保持在限制的 75% 以下。如果您的服务器正在使用超过该G1 Old Gen pool usage字段限制的 75%,那么您可能需要考虑升级您的服务器,或者调查内存泄漏的可能性。

可用于确定服务器是否内存不足的第二个指标是查看服务器中的垃圾收集器活动。为此,请运行命令/spark gc。这将显示两个部分,我们感兴趣的部分是该G1 Old Generation collector部分。在理想情况下,您应该有 0 个集合。如果您的集合总数为 0,则您的服务器不需要更多 RAM。否则,您应该检查收集的平均频率。如果这个数字不到一个小时左右,那么这可能表明您的服务器需要更多内存。它也可能表示内存泄漏。

什么是内存泄漏?

当 Java 应用程序使用内存而不释放它时,就会发生内存泄漏。发生这种情况的原因有很多,但最常见的原因是编写不当或有错误的插件。如果您遇到异常高的内存使用率,那么您可能有一个正在泄漏内存的插件。诊断此问题的最简单方法是删除插件,直到问题消失。不过,这通常需要相当长的时间。

如果你有技术倾向,还有更科学的方法来查找内存泄漏。首先,您将要进行堆转储。这可以通过运行来完成/spark heapdump --compress xz。这将转储您的服务器正在使用的所有内存并对其进行压缩(因此文件大小不是很大)。注意:这将在您的服务器上产生很大的延迟峰值。堆转储完成后,您可以从服务器下载堆转储并使用许多工具对其进行分析。一些流行的工具是HeapHero(免费)、Eclipse MAT(免费)、JXray(付费免费试用)和Yourkit(付费)。不要与您不信任的人共享您的堆转储。堆转储将包含敏感信息,包括私有数据库凭据和播放器 IP 地址。

使用这些工具之一打开堆转储后,您应该搜索正在使用高内存的插件。这些插件很有可能正在泄漏内存。鼓励您与插件开发人员共享此信息,因为他们可能能够帮助您解决问题或修复错误。如果您的大部分内存由服务器占用(特别是在与块相关的对象中),这表明您的服务器由于加载的块过多而内存不足,您可能需要升级到更多内存。

到底什么是垃圾收集?

垃圾收集是 Java 用来管理 RAM 的过程。当您的服务器需要内存来加载块或存储有关播放器的信息时,它会从 Java 请求此内存。当您的服务器用完它所使用的内存时(例如,当玩家退出或卸载块时),Java 不会立即释放该内存。相反,它认为这个内存是“垃圾”:没有被使用但没有被释放的内存。Java 会定期运行一个进程来查找所有这些垃圾内存并将其释放。这个过程称为垃圾收集。

Java中有许多不同的方法用于垃圾收集。用于 Minecraft 服务器的最流行的称为 G1GC,它代表 Garbage-First Garbage Collector。这个垃圾收集器将内存分成两组:最近分配的内存,更有可能是垃圾,以及很久以前分配的内存,过去已被证明不是垃圾。它还有两种不同类型的循环运行。第一个是 Young Gen 循环,它只扫描最近分配的内存。第二种类型是 Old Gen 循环,它扫描所有内存,包括很久以前分配的内存。通过搜索最近分配的内存,G1GC 更有可能快速找到要释放的内存。这些搜索速度非常快,通常在两位数毫秒的数量级上。因此,G1GC 倾向于仅在可能的情况下使用 Young Gen 循环。这会导致暂停时间很小,而且希望很少。

有时,一个Java进程运行了很长时间,在Old Gen pool中积累了大量的内存(也就是分配了很久还没有释放的内存)。如果 Java 无法通过 Young Gen 循环释放足够的内存,它将进入 Old Gen 循环,扫描这个长期的 Old Gen 池以搜索可以释放的内存。这个过程有很长的暂停时间,可以达到个位数秒。这会在您的服务器上导致非常不和谐的延迟峰值,可能会持续几秒钟。这些周期应该非常罕见,理想情况下根本不应该运行。如果它们经常运行,则表明您的服务器需要更多内存,因为它实际上正在使用它有权使用的所有 RAM。

那么我的服务器实际需要多少内存呢?

嗯,这是一个很难回答的问题,它取决于很多因素。在大多数情况下,这将取决于您加载了多少块。这取决于三个主要因素:您在线的玩家数量、您的服务器的观看距离以及您的玩家的分散程度。您的服务器在任何时候加载的块越多,您的服务器需要的内存就越多。大视距是服务器内存不足的主要原因。要解决此问题,您需要降低 中的视距server.properties和 中的无刻度视距paper.yml。即使将这些值减 1 也会对服务器正在加载的块数产生巨大影响。要知道您的服务器正在加载多少块,您可以使用命令/paper chunkinfo。在输出的底部,您会看到Chunks in all listed worlds,后面的数字Total表示你的服务器已经加载了多少块。

一些插件还会增加服务器的内存使用量。最大的罪魁祸首是网络地图插件,如 Dynmap、Pl3xMap 和 BlueMap。这些插件在渲染地图时会使用大量额外内存,并可能导致内存问题。如果您正在使用这些插件并且有内存问题,那么这些插件可能是原因。请查阅这些插件的文档以了解如何减少它们的内存使用量,或者如果您在使用这些插件时遇到问题,请升级您的可用内存。

世界重要吗?

虽然拥有更多世界会导致加载更多块,但它不会对服务器的内存使用产生巨大影响。内存主要由区块使用,虽然默认情况下额外的世界会加载生成区块,但这只是一个相对较小的数字。只有几个额外的世界不会对服务器使用的内存量产生重大影响。始终使用该/paper chunkinfo命令来确定您已加载了多少块。

更多 RAM 会提高我的性能吗?

也许。如果您有很多旧代垃圾收集活动,那么您可能会从额外的 RAM 中受益。如果您没有任何旧代垃圾收集活动,并且您的服务器没有耗尽内存,那么添加更多内存不会提高您的性能。事实上,给 Java 过多的内存可能会损害服务器的性能,因为更多的内存会使垃圾收集器工作得更加努力,从而导致服务器延迟更多。根据您询问的对象,您可能会找到不同的建议,但我们不建议为您的服务器分配超过 16-20GB 的内存。如果您遇到服务器性能问题,您可能会从升级 CPU 中获得更多好处。大多数性能问题是由劣质、过时的 CPU 引起的,而不是由内存量低引起的。

  • 2 用户发现这个很有用
此文章对您是否有帮助?

推荐您也看看这些

如何配置服务器配置文件server.properties

很多朋友在使用旋律工艺云计算面板服时都可能会使用 FTP下载server.properties编辑再上传回去 开服后却发现改动没有生效   正确的修改方式如下图 首先打开面板...

我的世界面板服控制面板密码重置教程

首先 打开 我的服务 管理服务 然后点击右上角的三个点 即可重置密码了

如何安装基础插件

1.打开安装模板功能 2.选择对应模板安装 选1.7.10基础插件 或者1.8~1.15.1基础插件 按版本选择 3.开启服务器(不开启是不会安装的)

如何加模组/加MOD/加插件/用自己的存档/上传地图

注意 看这篇教程前 开过服务器才会生成模组文件夹 插件文件夹 世界文件夹 必须用[MOD]核心才支持装MOD 所以没开服成功先看新手入门教程 上传任何文件都需要用到FTP...

自定义核心如何设置

1.直接在面板 Jar核心目录 处修改选项为 服务器主目录 (注意 修改为自定义核心模式后 无法使用我们提供的服务端 要重新使用我们的服务端 请将此项修改回管理系统的Jar文件夹)...