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

JVM 不分配使用 -Xmx 参数定义的所有内存

蒲昊
2023-03-14

我有一个jar文件,我使用systemd单元文件运行。单元文件中的run命令如下:

ExecStart=/usr/bin/java-Xms200m-Xmx465m——启用预览-jar-myapp-1.0.0.jar

我的应用程序总是记录允许使用的最大内存量。它使用以下代码对此进行记录:

public static int ONE_MEGABYTE_IN_BYTES = 1048576;
Runtime runtime = Runtime.getRuntime();
int maximumJVMHeapAllocation = Math.round(runtime.maxMemory() / oneMegabyteInBytes);

由于某种原因,runtime.maxMemory() 的值总是比 -Xmx 参数的值小 15mb 左右。因此,如果jar文件使用参数-Xmx465m运行,则应用程序将仅获得450mb的可用RAM内存。

我的问题是:剩余的15 mbRAM用于什么?用于堆栈内存吗?

编辑:避免混淆;服务器可用的RAM总量为< code>1GB。其中< code>512MB由操作系统< code>Amazon Linux 2使用。

共有1个答案

沈皓君
2023-03-14

显然,JVM使用并行或串行GC运行,其中堆的年轻一代由Eden和两个幸存者空间组成。

JVM将其中一个幸存者空间保持为空:应用程序不能同时使用这两个空间。因此,是运行时。maxMemory不包括一个幸存者空间的大小(在您的情况下,它似乎是15 MB)。

其他GC算法表现不同。例如,如果使用-XX:UseG1GC运行JVM,则最大可用内存运行时所示。maxMemory将等于-Xmx(更准确地说,由于对齐,它将是466MB)。

 类似资料:
  • JVM选项: 正如预期的那样,JVM将为JVM堆分配将近20MB的内存。 但请参阅以下 GC 详细信息: PSYoungGen总计9216K,已用4612k[0x 00000000 ff 6000000,0x 0000000010000000100000000]< br > Eden空间8192K,56%已用[0x 000000000 ff 600000,0x 0000000 FFA 812d 8

  • 问题内容: 本着Java的精神:为什么存在MaxPermSize?,我想问一下为什么Sun JVM对其内存分配池的大小使用固定的上限。 默认值为物理RAM的1/4(有上限和下限);结果,如果您有一个内存消耗大的应用程序,则必须手动更改限制(参数- Xmx),否则您的应用程序将运行不佳,甚至可能因OutOfMemoryError崩溃而崩溃。 为什么这个固定限制甚至存在?为什么JVM不能像大多数操作系

  • 我有以下代码: 您可以看到每个操作分配5M。当我设置时,它无一例外地成功运行,而当时,它会引发异常。有人能解释一下为什么吗?我在Windows 7、64bit、Eclipse 4.3下。以下代码是相同的结果:

  • 当我运行用pyspark编写的spark作业时,我会运行一个jvm,它的Xmx1g设置似乎无法设置。以下是ps aux的输出: 我的问题是,如何设置此属性?我可以使用SPARK\u DAEMON\u memory和SPARK\u DRIVER\u memory设置主内存,但这不会影响pyspark的派生进程。 我已经尝试了JAVA\u选项,或者实际查看了包的文件,但无法理解这是在哪里设置的。 设置

  • 我使用两次作为启动参数启动了java应用程序(Java8版本),而不是使用一次和一次。我马上改变了它,但我在研究它会有什么影响。 它会默认设置吗?它是否没有最大的堆内存,对垃圾回收器有影响,运行的频率降低,甚至不运行?

  • 据我所知,两者都定义大小。没有?建议使用什么:或?如果我两个都用,哪一个比另一个好?