【问题标题】:Java OOM in multi-process fitnesse testing environment多进程适应度测试环境中的Java OOM
【发布时间】:2016-12-30 19:06:24
【问题描述】:

我们正在使用 Fitnesse 对基于 Web 的复杂应用程序进行验收测试。完整的套件需要几个小时才能通过,因此我们正在使用多个进程。设置如下:

  1. maven forks Fitnesse 服务器进程
  2. maven 向 Fitnesse 服务器发起 http 调用
  3. fitnesse 服务器为每个调用派生一个测试运行器
  4. http调用返回,返回2。

3.中启动jvm的命令行基于http调用参数构建在fitnesse jar中。这意味着您不能传入任意 jvm 参数,只能传入受支持的参数。

现在,我们面临的问题是,有时启动 3 次的进程会挂起。它看起来不像是超时问题,因为我们已经看到它们挂了几个小时。

这些 jvm 进程不会通过 jmx 公开任何内容,因此我们无法使用 jconsole 或类似方法连接到它们。根据每个进程消耗的内存量(1-1.5G),我强烈怀疑 OOM 发生在 runner 进程的某个地方并阻止它正常退出。此外,在服务器进程上尝试“kill -3”会产生

Exception in thread "CommandRunner stdOut" java.lang.OutOfMemoryError: Java heap space  at java.util.Arrays.copyOf(Arrays.java:3332)

在启动的运行程序进程中似乎是标准输出,但我不确定。

我目前正在考虑的解决方案是创建控制命令行的类的副本,以便每个进程都以随机的 jmx 端口和调试端口启动,因此如果它挂起 - 可以连接和调查。

所以,问题是 - 有更好的方法吗?我在这里遗漏了什么明显的东西吗?

【问题讨论】:

  • 您是否需要一个生成测试运行器的进程?我有一个类似的并行化测试套件,但我的每个子套件都是完全独立的。这对你有用吗?
  • @FriedHoeben,原则上可以。但这意味着我必须重写整个事情。我们的这部分测试基础设施是继承的,我不想花很多时间从头开始重写它。

标签: java remote-debugging fitnesse fitnesse-slim


【解决方案1】:

我不相信 FitNesse 的核心是线程安全的。因此,与其将精力集中在控制运行器的启动方式和调试这些运行器上,我建议您尝试运行彼此完全隔离的测试过程。通过为 FitNesse 和测试运行程序使用单个进程(当您想要并行运行套件时使用多个进程),如果有任何问题,调试也变得更容易(因为您不必控制额外的进程并附加到这些新进程,只有用于测试运行/套件的进程)。

我所做的是通过 jUnit 运行程序(它使用单个进程同时运行 FitNesse 和测试运行程序)运行我的测试套件,并为我想要并行运行的每个测试套件启动一个单独的 (jUnit) 进程。我实际上并没有通过 maven 控制进程创建,而是在 Jenkins 作业中使用多个进程。每个都执行相同的 maven 命令,但具有不同的系统属性,其中一个系统属性控制要执行的套件。

使用这种方法可能对您的测试设置造成太大的改变。但我相信你可以稍微改变你的过程并获得类似的结果。您还没有具体说明 maven pom 的结构。但是你能不能只为每个套件重复步骤 1-4,而不是只重复步骤 2-4。这似乎只需要更改 FitNesse 服务器侦听的端口(在步骤 1 中),这很容易通过命令行参数 (-p) 完成。通过将&debug 添加到步骤 2 中使用的 URL,应该可以在与 wiki 相同的过程中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多