我在我的 Windows 上安装了 6GB 内存和 5GB 可用内存空间,当我运行一个指定 Java 堆空间 -Xmx2048m 的 Java 程序时,它工作正常。我的问题是,如果我的 Linux 机器上有这个怎么办
cat /proc/meminfo
MemTotal: 10.130464 kB (10.1gb)
MemFree : 248.736 kB (248mb)
如果我用这个内存在 Linux 中运行带 -Xmx2048m 的 Java 程序会怎样?
最佳答案
Java 将允许堆增长到 Xmx 值,但它不一定开始或需要使用那么多。 Xms 指定最小堆大小,即 Java 将在开始时分配多少堆内存。 Java 将为 Perm Gen 分配额外的内存。任何程序,不仅仅是 Java,如果在没有可用内存时需要更多内存,都会开始失败。当达到 Xmx 或机器上没有可用内存时,Java 尤其会抛出 OutOfMemoryError。
MemFree 是剩余的物理内存量,但不是可用内存总量。当物理内存已满时,操作系统将使用交换空间(SwapTotal 和 SwapFree)。交换空间通常在硬盘上,因此非常慢。 Linux 会尝试将最常用的内存块保留在物理内存中以保持性能,但通常会有一些减速。考虑到剩余的可用物理空间相对较少,Linux 机器可能已经在使用一些交换空间。结合 MemFree 和 SwapFree 以获得总可用内存。
编辑:使用 1.8GB 总物理空间加上无交换空间,您将能够启动 Java,因为它最初使用 Xms(最小堆)加上 PermGen 内存,在 10GB 物理内存(1/64 物理内存加上 64MB PermGen)上默认为 220MB .当您的程序运行时,它可以使用剩余的可用系统内存,但前提是您的程序确实需要它。如果这个程序不是资源密集型的,它可能会停留在低端。通常你应该设置 Xmx,这样它就不会占用你所有的内存。如果您的内存使用率很高,您可能只想关闭一些其他程序。
关于Windows 7 或 Linux 的 Java 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29785150/