我在/ 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程序。 他们有各自的堆和记忆分配。
但是,我坚持以下查询:
答案 0 :(得分:2)
1)考虑到它们在堆中占用300 MB,我可以运行多少个并行实例?
您可能应该创建比 physical 内存支持的实例更多的实例。但是,您不能仅将实例数乘以堆大小,因为JVM需要更多内存。相反,您需要使用监视工具(如top
)来确定每个实例实际使用的内存量。
请注意,如果有足够的交换空间,Linux将允许您创建比物理内存更多的进程。但是,如果进程全部处于活动状态,则它们会有效地竞争内存,并且系统花费大部分时间等待,而属于一个进程的页面被“换出”而其他页面被“交换”在”
2)应该有一个最大上限(在操作系统级别),在一定数量的实例后冻结?
可能存在的进程数量很可能存在上限,但这不太可能成为问题。这个问题将是资源竞争;例如CPU周期,物理内存,内存带宽,磁盘带宽和网络带宽。
3)我不能继续开展100或1000个并行流程?
这不是一个好主意。如果你过度分配内存,并且有太多活动进程在争夺内存,那么可能会发生两件事:
由于“虚拟内存颠簸”,系统性能将大幅下降。
在Linux上,“oom killer”将开始查杀进程,以防止系统完全锁定。被杀死的进程可能是您的JVM实例......或者它们可能是其他的。
答案 1 :(得分:0)
取决于您的计算机上有多少可用内存。如果你有1G,那么运行7个实例将是棘手的......
一旦你用完RAM,我认为Unix会开始将JVM交换到光盘(他的猜测是......)。如果这种情况开始发生,您的流程就不会死亡,但您会发现性能明显下降。
如果你这样做,你将会感到失望....有一点交换也会耗尽,此时你可能已经成功地崩溃整个unix盒。
您是否考虑过更改代码以尝试使进程在同一JVM中作为单独的线程运行?它可能会显着减少内存占用。
答案 2 :(得分:0)
对具有相同编号的问题的答案:
1)理论上没有限制。您唯一受限的是可用的内存/ RAM。如果你说3GB RAM然后(你的进程)* 512 +系统所需的内存应该是3GB。这是因为堆在启动时分配,如果堆分配失败 - 您的JVM进程将无法启动。但这又取决于某个进程在给定时间点消耗了多少内存
2)不是我知道 - 你的操作系统细节好吗?
3)检查(1)