【发布时间】:2013-02-23 07:11:56
【问题描述】:
我正在编写一个项目(用 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 与服务器相比真的很慢。这是一个糟糕的选择
【问题讨论】:
-
堆内存和栈内存是分开配置的。您在顶部看到的内存包括两者。
-
我意识到这一点,但我不认为这是堆栈内存。我没用那么多。那么内存还可能来自哪里
-
您是否也设置了最小堆大小?如果
-Xms大于-Xmx,我认为它最多使用-Xms -
我正在使用-server,我认为它设置了最小堆大小,但没有明确
-
也尝试将其设置为 50m。
标签: java memory memory-management stack