我正在为一个Java课程写项目,教授说我们不能使用超过200m的内存,所以我用-Xmx50m将堆栈内存限制为50m(只是为了确保),但是根据top的显示,它仍在使用300m。
我尝试运行Eclipse Memory Analyzer,报告只有26m。
所有这些都可能是堆栈内存吗?我很确定我从来没有超过大约300个方法调用深度(是的,这是一个递归的DFS搜索),所以这意味着每个堆栈帧几乎使用了1兆字节,这似乎难以置信。
该程序是单线程的。是否有人知道我可以减少内存使用的其他地方?另外,如何检查/限制堆栈使用多少内存?
更新:我现在正在使用以下JVM选项,但没有效果(根据top仍然是大约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。所以我想这解决了我的问题。有人能解释一下为什么需要这样吗?还有,有任何缺点需要我知道的吗?
再更新一下:与server相比,cacao真的非常慢。这是一个糟糕的选项。
-Xms
大于-Xmx
,我认为它会使用最大值-Xms
。 - Sotirios Delimanolis