我刚刚开始使用JVM堆大小的R& D并观察到一些奇怪的行为。
以下是观察结果:
我写了一个样本主程序,它开始于&立即进入等待状态。
当我使用 -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;优化,但那些文章没有回答我的问题。
提前致谢。
谢谢, 把集
答案 0 :(得分:0)
我想知道为什么你不能用-Xmx1024M -Xms1024M开始超过3个进程。我在我的4GB Linux系统上测试过它,我可以启动至少6个这样的过程;我没有尝试开始更多。
无论如何,这是因为如果您使用-Xmx1024M -Xms1024M启动它,程序实际上并没有使用该内存。这些只是指定堆的最大大小。如果你没有分配那么多的数据,那么这个内存就不会被实际使用了。
"顶部"显示这些进程的虚拟集大小超过1024M,但它实际上并没有使用该内存。它刚刚分配了地址空间但从未使用它。
答案 1 :(得分:0)
PC中的实际内存和分配的内存不能相互匹配。实际上,当你的ram已满时,你的操作系统正在将数据从RAM上传输到硬盘上。这称为交换/ Ram-paging。 这就是为什么Windows在hdd上有swap文件而且unix有一个交换分区。