最大独立JVM进程

时间:2013-06-28 09:11:52

标签: java performance parallel-processing

我在/ home / apps / java的unix系统上部署了java。 export JAVA_HOME =“/ home / apps / java”

有一些shell脚本并行运行(目前:数量为5个),并带有以下命令: $ JAVA_HOME / bin / java -Xmx512M com.home.prac.SendNotification

Java程序执行db操作并发出通知。 这里创建了几个对象,每个执行峰值堆积到大约300 MB。 我没有在这里共享代码,因为我的查询与它无关。因此,我刚刚简要介绍了这个目的。 我的理解是,将启动单独的JVM独立进程,以执行Java程序。 他们有各自的堆和记忆分配。

但是,我坚持以下查询:

  1. 考虑到它们在堆中占用300 MB,我可以运行多少个并行实例?
  2. 应该有一个最大上限(在操作系统级别),在一定数量的实例后冻结?
  3. 我不能继续开展100或1000个并行流程?
  4. 我有一个跟进问题,但我想先在这里澄清这个概念。

3 个答案:

答案 0 :(得分:2)

  

1)考虑到它们在堆中占用300 MB,我可以运行多少个并行实例?

您可能应该创建比 physical 内存支持的实例更多的实例。但是,您不能仅将实例数乘以堆大小,因为JVM需要更多内存。相反,您需要使用监视工具(如top)来确定每个实例实际使用的内存量。

请注意,如果有足够的交换空间,Linux将允许您创建比物理内存更多的进程。但是,如果进程全部处于活动状态,则它们会有效地竞争内存,并且系统花费大部分时间等待,而属于一个进程的页面被“换出”而其他页面被“交换”在”

  

2)应该有一个最大上限(在操作系统级别),在一定数量的实例后冻结?

可能存在的进程数量很可能存在上限,但这不太可能成为问题。这个问题将是资源竞争;例如CPU周期,物理内存,内存带宽,磁盘带宽和网络带宽。

  

3)我不能继续开展100或1000个并行流程?

这不是一个好主意。如果你过度分配内存,并且有太多活动进程在争夺内存,那么可能会发生两件事:

  • 由于“虚拟内存颠簸”,系统性能将大幅下降。

  • 在Linux上,“oom killer”将开始查杀进程,以防止系统完全锁定。被杀死的进程可能是您的JVM实例......或者它们可能是其他的。

答案 1 :(得分:0)

  1. 取决于您的计算机上有多少可用内存。如果你有1G,那么运行7个实例将是棘手的......

  2. 一旦你用完RAM,我认为Unix会开始将JVM交换到光盘(他的猜测是......)。如果这种情况开始发生,您的流程就不会死亡,但您会发现性能明显下降。

  3. 如果你这样做,你将会感到失望....有一点交换也会耗尽,此时你可能已经成功地崩溃整个unix盒。

  4. 您是否考虑过更改代码以尝试使进程在同一JVM中作为单独的线程运行?它可能会显着减少内存占用。

答案 2 :(得分:0)

对具有相同编号的问题的答案:

1)理论上没有限制。您唯一受限的是可用的内存/ RAM。如果你说3GB RAM然后(你的进程)* 512 +系统所需的内存应该是3GB。这是因为堆在启动时分配,如果堆分配失败 - 您的JVM进程将无法启动。但这又取决于某个进程在给定时间点消耗了多少内存

2)不是我知道 - 你的操作系统细节好吗?

3)检查(1)