2

我在 /home/apps/java 的 unix 系统上部署了 java。导出 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. 我有一个后续问题,但想先在这里澄清这个概念。
4

3 回答 3

2

1) 考虑到它们都占用 300 MB 的堆空间,我可以运行多少个这些并行实例?

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

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

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

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

3) 我不能直接启动 100 或 1000 个并行进程吗?

那将是一个坏主意。如果您过度分配内存,并且有太多活动进程竞争内存,则可能会发生两种情况:

  • 由于“虚拟内存抖动”,系统性能将急剧下降。

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

于 2013-06-28T09:25:29.020 回答
0
  1. 取决于您的机器上有多少可用 RAM。如果你有1G,那么运行7个实例会很棘手......

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

  3. 如果你这样做,你会失望的....有一点swap也会耗尽,此时你可能已经成功地破坏了整个unix盒子。

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

于 2013-06-28T09:25:15.920 回答
0

相同编号的问题的答案:

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

2)我不知道 - 请提供您的操作系统详细信息?

3) 检查 (1)

于 2013-06-28T09:27:02.120 回答