gpt4 book ai didi

Java 使用的内存远多于使用 -Xmx 分配的内存

转载 作者:IT老高 更新时间:2023-10-28 20:52:38 26 4
gpt4 key购买 nike

我正在编写一个项目(用 Java 编写),教授说我们不允许使用超过 200m 的类我使用 -Xmx50m 将堆栈内存限制为 50m(绝对确定),但根据顶部,它仍在使用 300m

我尝试运行 Eclipse Memory Analyzer它只报告了 26m

这可能都是堆栈上的内存吗?我很确定我永远不会超过大约 300 个方法调用深度(是的,这是一个递归 DFS 搜索),所以这意味着每个堆栈帧都在使用几乎是一兆字节,这似乎令人难以置信。

程序是单线程的。有谁知道我可能会减少内存使用的其他地方?另外,如何检查/限制堆栈使用的内存量?

更新:我现在正在使用以下 JVM 选项但没有任何效果(根据顶部仍然大约 300m):-Xss104k -Xms40m -Xmx40m -XX:MaxPermSize=1k

另一个更新:实际上,如果我让它运行更长一点(使用所有这些选项)大约一半的时间它会在 4 或 5 秒后突然下降到 150m(另一半不会下降)。真正奇怪的是我的程序没有随机性(正如我所说的它是单线程的),所以没有理由在不同的运行中表现不同

会不会和我使用的 JVM 有关?

java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.3) (6b27-1.12.3-0ubuntu1~10.04)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

根据java -h,默认JVM是-server。我尝试添加 -cacao,现在(使用所有其他选项)它只有 59m。所以我想这可以解决我的问题。谁能解释为什么这是必要的?另外,有什么我应该知道的缺点吗?

另一个更新:cacao 与服务器相比真的很慢。这是一个糟糕的选择

最佳答案

Top 命令反射(reflect)了 Java 应用程序使用的内存总量。其中包括:

  • JVM 本身的基本内存开销
  • 堆空间(以 -Xmx 为界)
  • 永久代空间(-XX:MaxPermSize - 并非所有 JVM 的标准)
  • 线程堆栈空间(每个堆栈 -Xss)可能会根据线程数显着增长
  • native 分配使用的空间(使用 ByteBufer 类或 JNI)

关于Java 使用的内存远多于使用 -Xmx 分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15282178/

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