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

标签 java memory memory-management stack

我正在编写一个项目(用 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/

相关文章:

iphone - 显示键盘会增加内存...但它永远不会下降 iPhone

android - 为什么图像由android :src in xml remain stored in heap?设置

c++ - 关于手动内存管理和深度复制的新手问题

c++ - 非拥有指针作为现代 C++ 中的类成员

java - 通过 Java 中的包含检查爬虫 IP 列表的最快方法

c - 如何获取指向动态库(Linux ELF)特定部分的指针?

java - SOLR 在搜索时选择索引

ios - 从内存中释放 SKTextureAtlas

java - "Access Denied"尝试复制使用 JGit 拉取的文件时出现消息

java - 将选择监听器添加到 jface tableviewer 表的行,不允许多选