JVM堆大小问题

pvabu6sv  于 2022-11-07  发布在  其他
关注(0)|答案(2)|浏览(130)

我刚刚开始研究JVM堆大小,并观察到一些奇怪的行为。

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

以下是观察结果:
我写了一个示例主程序,它启动后立即进入wait状态。
当我运行程序从*eclipse*-Xms 1024 m-Xmx 1024 m参数,它可以运行3次/并行进程从eclipse,即3个并行进程,因为我的RAM只有4GB。这是预期的行为。
因此,我重新运行了相同的**-Xms 512 m-Xmx 512 m参数,它可以运行19次/并行处理从Eclipse,即使我的内存是4GB。
我使用
VisualVM工具进行交叉检查,我可以看到19个进程ID,每个进程ID都分配了512 m**,即使我的RAM大小是4GB,但如何?
我已经浏览了很多关于内存管理和优化的oracle文档,但这些文章没有回答我的问题。
先谢谢你。
谢谢你,Baji

iswrvxsc

iswrvxsc1#

我想知道为什么你不能用-Xmx 1024 M-Xms 1024 M启动3个以上的进程。我在我的4GB Linux系统上测试过,我至少可以启动6个这样的进程;我没有试着开始更多。
无论如何,这是因为如果你用-Xmx 1024 M-Xms 1024 M来启动程序,程序实际上并不使用内存。这些只是指定了堆的最大大小。如果你不分配那么多的数据,那么内存就不会被实际使用。
“top”显示这类进程的虚拟集大小大于1024 M,但实际上它并没有使用该内存。它只是分配了地址空间,但从未使用过。

yxyvkwin

yxyvkwin2#

你电脑的实际内存和分配的内存不能互相匹配。事实上,当你的内存满了的时候,你的操作系统会把数据从内存移到硬盘上。这就是所谓的交换/内存分页。这就是为什么windows在硬盘上有交换文件,而unix有交换分区。

相关问题