Java JVM堆大小问题

Java JVM堆大小问题,java,jvm,heap,heap-memory,Java,Jvm,Heap,Heap Memory,我刚开始研发JVM堆大小,并观察到一些奇怪的行为 我的系统内存大小是4 GB 操作系统是64位Windows7 Java版本是1.7 以下是观察结果: 我编写了一个示例主程序,它启动并立即进入等待状态 当我使用-Xms1024m-Xmx1024m参数从eclipse运行程序时,它可以从eclipse运行3次/并行进程,即仅3次并行进程,因为我的RAM仅为4GB。这是预期的行为 因此,我使用-Xms512m-Xmx512m参数重新运行了相同的程序,即使我的RAM是4GB,它也可以从eclips

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

  • 我的系统内存大小是4 GB
  • 操作系统是64位Windows7
  • Java版本是1.7
以下是观察结果:

我编写了一个示例主程序,它启动并立即进入等待状态

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

因此,我使用-Xms512m-Xmx512m参数重新运行了相同的程序,即使我的RAM是4GB,它也可以从eclipse运行19次/并行进程。怎么做

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

我看了很多关于内存管理和优化的oracle文档,但是这些文章没有回答我的问题

提前谢谢

谢谢,
Baji

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

不管怎么说,这是因为如果只使用-Xmx1024M-Xms1024M启动程序,那么程序实际上并不使用该内存。这些只是指定堆的最大大小。如果不分配那么多的数据,那么这个内存就不会被实际使用


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

电脑中的实际内存和分配的内存不得相互匹配。事实上,当RAM已满时,操作系统正在将数据从RAM移动到hdd。这称为交换/Ram分页。
这就是为什么windows在硬盘上有交换文件,而unix有交换分区。

Goggle告诉我,计算机可以交换RAM,通过释放当时不使用的位来虚拟地创建更多的RAM内存。如果是这样,在上述两种情况下应该是一致的,但行为是不同的。你确定所有进程都是并行启动的吗?是的,当我使用-Xms512m-Xmx512m参数运行时,它在parllel中启动了19个进程。我已经用VisualVM工具进行了交叉验证,它向我显示了所有19个进程ID和每个分配的512MHey!Juhist,谢谢你的快速更新。那么,这是否意味着您可以使用-Xmx1024M-Xms1024M启动100个进程?当您的程序实际上不使用任何数据/内存时。是的,您应该能够启动甚至100个进程。或者我不太确定,这取决于JVM为不需要任何额外内存的进程使用了多少内存。但是,即使在4GB环境中使用-Xmx1024M-Xms1024M,您至少应该能够启动数十个进程。好的,非常感谢。但在4GB windows 7环境中,我仍然只能使用-Xmx1024M-Xms1024M启动3进程。您是否尝试过从命令行而不是从Eclipse运行该命令?您实际收到的错误消息是什么?我没有安装Windows、Eclipse和Java1.7,只有Linux命令行和标准的JVM1.6。但是您应该在某处找到java.exe并开始使用c:\path\to\java.exe-Xmx1024M-Xms1024M cl.as.sHey!谢谢你的投入。如果是,为什么在-Xms1024m-Xmx1024m的情况下,不允许运行超过3次/进程?然而它允许19个进程使用-Xms512m-Xmx512m,即使我有4 GB的RAM?