JVM堆大小问题

时间:2015-03-23 14:30:45

标签: java jvm heap heap-memory

我刚刚开始使用JVM堆大小的R& D并观察到一些奇怪的行为。

  • 我的系统RAM大小为4 GB
  • 操作系统是64位Windows 7
  • Java版本为1.7

以下是观察结果:

我写了一个样本主程序,它开始于&立即进入等待状态。

当我使用 -Xms1024m -Xmx1024m 参数从 eclipse 运行程序时,它可以从eclipse运行3次/ parallel-process即3个并行进程,因为我的RAM仅为4GB。这是预期的行为。

因此我使用 -Xms512m -Xmx512m 参数重新运行它,并且它能够从eclipse运行19次/并行进程,即使我的RAM是4GB。怎么样?

我使用 VisualVM 工具进行交叉检查,我可以看到19个进程ID,每个进程ID分配 512m ,即使我的RAM大小为4GB,但如何?

我已经护目镜了。关于Memory Management& amp;优化,但那些文章没有回答我的问题。

提前致谢。

谢谢, 把集

2 个答案:

答案 0 :(得分:0)

我想知道为什么你不能用-Xmx1024M -Xms1024M开始超过3个进程。我在我的4GB Linux系统上测试过它,我可以启动至少6个这样的过程;我没有尝试开始更多。

无论如何,这是因为如果您使用-Xmx1024M -Xms1024M启动它,程序实际上并没有使用该内存。这些只是指定堆的最大大小。如果你没有分配那么多的数据,那么这个内存就不会被实际使用了。

"顶部"显示这些进程的虚拟集大小超过1024M,但它实际上并没有使用该内存。它刚刚分配了地址空间但从未使用它。

答案 1 :(得分:0)

PC中的实际内存和分配的内存不能相互匹配。实际上,当你的ram已满时,你的操作系统正在将数据从RAM上传输到硬盘上。这称为交换/ Ram-paging。 这就是为什么Windows在hdd上有swap文件而且unix有一个交换分区。