gpt4 book ai didi

java - Java 中的什么在虚拟内存中使用 400M,我如何降低该使用量?

转载 作者:行者123 更新时间:2023-11-30 09:51:02 24 4
gpt4 key购买 nike

简单程序:

public class SleepTest {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(60 * 1000);
}
}

然后

$ javac SleepTest.java 
$ java -cp . SleepTest

对于 OpenJDK 1.6.0_20,这在我的机器上使用了 600M 的虚拟内存!也就是说,“顶部”显示“VIRT”600M 和 RES 10m。 (我使用的是 Ubuntu 10.04,32 位或 64 位)。

对于 Sun 的 Java 1.6.0_22,它使用 400M 的虚拟内存。

什么在使用所有这些虚拟内存,我该如何降低使用量?

完整的“java 版本”:

OpenJDK:

java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.4) (6b20-1.9.4-0ubuntu1~10.04.1)
OpenJDK Client VM (build 19.0-b09, mixed mode, sharing)

太阳:

$ /usr/lib/jvm/java-6-sun-1.6.0.22/jre/bin/jav -version
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)

编辑:

从任何一个包中使用 javac 进行编译似乎都没有帮助。

添加一些代码来打印已用内存如下:

private static String megabyteString(long bytes) {
return String.format("%.1f", ((float)bytes) / 1024 / 1024);
}
private static void printUsedMemory() {
Runtime run = Runtime.getRuntime();
long free = run.freeMemory();
long total = run.totalMemory();
long max = run.maxMemory();
long used = total - free;
System.out.println("Memory: used " + megabyteString(used) + "M"
+ " free " + megabyteString(free) + "M"
+ " total " + megabyteString(total) + "M"
+ " max " + megabyteString(max) + "M");
}

表演

太阳:

Memory: used 0.3M free 15.2M total 15.5M max 247.5M

OpenJDK:

Memory: used 0.2M free 15.3M total 15.5M max 494.9M

即使使用 -Xmx5m,它也必须有一个最小值吗?我之前读过有关默认值的内容(取决于 jvm、虚拟机,这是一种默认使用四分之一物理内存的常见策略),但这是否会导致大量虚拟内存的使用,我不能减少它吗?

编辑#2:

添加 -Xmx 会改变一些事情:

$ java -Xmx5m -cp . SleepTest

OpenJDK:

$ java -Xmx5m SleepTest
Memory: used 0.2M free 4.7M total 4.9M max 5.8M

为任一 JVM“仅”使用 150M 的虚拟内存。

编辑#3:

nos、bestsss、Mikaveli 和其他人可能指出虚拟内存不使用交换。 nos 声称 OOM killer 足够聪明,可以根据实际内存使用情况进行处理。如果这些都是真的,那么我想我不关心虚拟内存的使用。 RES(居民尺寸)很小,所以我很好。

编辑#4:

不确定接受哪个答案。这些中的任何一个,如果它显示为答案:“不要担心,因为虚拟内存很便宜”或者解释为什么 Java 在虚拟内存中保留至少 150M,无论我给它什么 -Xmx 或 -Xms,即使实际内存使用量很小。

编辑#5:

这是一个 dup .我投票决定关闭。

最佳答案

“RES”是常驻集大小 - 本质上是您为该进程使用的物理内存。

在您的示例中,top 声明它使用 10 MiB - 这大致是我对 5m 的 -Xmx 设置的期望值(根据我在 *nix 系统上使用 Java 的经验,通常使用的总物理内存似乎是两倍.

您是否真的遇到了任何内存问题,或者您只是担心“top”的误导性输出?

此外,*nix 虚拟内存包括可用内存空间 - 物理内存和交换内存。如果进程未使用任何“交换”,则它仅使用物理“常驻”内存。

Stack Overflow answer to why JVM uses more memory than just heap setting.

关于java - Java 中的什么在虚拟内存中使用 400M,我如何降低该使用量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4852804/

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