Java JVM 堆大小

标签 java memory jvm

我有一个应用程序在启动时使用以下命令请求特定数量的 RAM。

java -Xms512m -Xmx985m -jar someJarfile.jar

此命令无法在我具有 8.0GB RAM 的计算机上运行,​​因为它无法创建指定大小的对象堆。如果我将最大范围降低到 700MB 以下,它就可以正常工作。

更奇怪的是,当 -Xmx 标志值超过 700m 时,即使执行简单的 java -Xmx768m -version 也会失败。我正在尝试使用 Java 1.7Uu67 32 位(构建 jar 时使用的)甚至更新版本的 Java 1.7 和 event Java 1.8 来运行它。如果最大堆更高并且我使用的是 32 位,我会理解,但它不超过 32 位 java 的 ~1.4GB 上限

是否有我在某个地方遗漏的配置参数会导致这种情况,某种可能会干扰的软件?对于为什么我不能在具有 8.0GB RAM 的机器上分配 700MB RAM 对我来说没有意义。我

我还应该注意到,没有其他正在运行的进程占用了我的所有 RAM。这是 Windows 7 的全新安装。

最佳答案

虽然 700 MB 很低,但这并不奇怪。

Windows 中的 32 位 Windows XP 模拟器的工作方式与 Windows XP 相同,但有其所有限制。这意味着您向操作系统丢失了 2 GB 或潜在的 4 GB。这意味着已经运行的程序会耗尽虚拟内存空间。此外,如果您的程序使用共享库或堆外存储(如直接内存和内存映射文件),这将意味着您丢失了堆的虚拟内存。实际上,无论您实际拥有多少内存,您的应用程序只能使用 1.4 GB 的虚拟内存。

解决此问题的简单方法是使用 64 位 JVM,它在您的 64 位操作系统中运行并且也受到限制,但在 Windows 上只能使用 192 TB 的虚拟内存。

关于Java JVM 堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32128809/

相关文章:

java - Stream.max() 总是比stream.reduce() 快吗?

java - EAR 版本 1.4、5、6

java - 使用 Scanner 对象读取一系列输入

jvm - 命令行中用于编译和运行 .java 文件的目录

java - Java 在 String 上的工作速度比 ArrayList 慢多少?

java - hbase 拒绝远程用户连接

c++ - 为什么operator delete的签名要带两个参数?

c - 初级内存分配

java - 实际示例中的内存泄漏

java - JVM 中有 JSR-335 特殊支持吗?提升基于 JVM 的函数式语言?