java - 不同 JVM 中的 Java 程序如何在无意中相互影响?

标签 java multithreading jvm interaction

我正在运行 3 个 Java 应用程序,每个应用程序都在自己的 JVM 中。

然后,所有应用程序在大约 30 分钟后(同时)卡住。 当只运行一个 JVM 时,问题不会出现,并且已经证明它在重负载下稳定超过 13 小时。该问题仅在我运行多个 JVM 时出现。

澄清一下,程序之间没有(有意的)交互。此外,程序使用 2 个线程,每个线程以同步方式一起工作。应用程序是相同的,只是运行在不同的数据上。同样,它们应该完全独立于彼此,因为每个程序都在自己的 JVM 上运行。

我并不是要针对我的问题寻求具体的解决方案,但我有兴趣了解这种行为是否常见。

最重要的是,如果这是一个众所周知的问题,是否有关于如何避免此类问题的经验法则?是否存在已知会导致类似问题的多线程方面(在我的例子中,每个程序使用两个线程)?

+更新: 首先,这是用于线程间等待/通知操作的代码。

主线程,只有两个方法(循环调用):

public void waitCycles(int c) {
    worker.setWaitDuration(c);
    try {
        synchronized (this) {
            this.wait(500);//very unlikely to actually wait 500ms. Should be notified.
        }
    }
    catch (Exception e) {
    }
}
float[] learn(boolean[] values) {
    worker.setLearnValues(values);
    try {
        synchronized (this) {
            this.wait(500);//Same as above
        }
    }
    catch (Exception e) {
    }
    float[] out = worker.quality;
    worker.quality = null;
    return out;
}

这是来自 Worker-Class(扩展线程)的代码,也是循环的一部分:

        if (learnValues != null) {
            float[] q = new float[learnValues.length];
            for (int i = 0; i < learnValues.length; i++) {
                q[i] = outs[i].learn(learnValues[i], 1);
            }
            quality = q;
            learnValues = null;
            synchronized (host) {
                host.notifyAll();
            }
        }
        //"waiter" is an integer value that is set by calling "setWaitDuration(int c)"
        if (waiter > 0) {
            waiter--;
            if (waiter <= 0) {
                waiter = -1;
                synchronized (host) {
                    host.notifyAll();
                }
            }
        }

卡住后两个线程仍然消耗大量处理器时间,这没有意义,因为程序应该写入包含当前学习进度信息的文本文件,但这并没有发生(尽管两个线程仍在运行) . 我已经仔细检查过,没有可能导致这种情况的无限循环。 而且仍然无法理解为什么所有三个程序似乎同时卡住。 我在 Windows 8 上使用 JDK8u25 及其内置的 JRE。我没有遇到任何内存问题。

最佳答案

我的脑海里立刻浮现出两件事:

  1. 服务器内存。通过同时运行 3 个 JVM,您的服务器可能过载并且所有 3 个应用的性能都会显着下降

  2. 磁盘/网络等外部IO。如果您的所有应用都依赖于磁盘或网络连接,而您的服务器磁盘空间不足或网络连接断开,那么这 3 个应用可能会同时出现问题

关于java - 不同 JVM 中的 Java 程序如何在无意中相互影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29044052/

相关文章:

java - 线程中出现异常 "Thread-1"java.lang.UnsatisfiedLinkError : no jnivideoInputLib in java. library.path

java - 遍历深度优先搜索时从邻接表中获取节点 - Java

c# - 如何停止非响应线程

java - 本地 Tomcat 环境未启动

Android - 更改 Activity 时的多线程问题

java - 使用带有线程参数的 Gregory-Leibniz 时出现 pi 值错误

java - 获取当前在 Java 中运行的所有线程的列表

java - JVM 如何在 CPU 核心之间分布线程?

java - java-1.7.0-openjdk-i386 和 java-7-openjdk-i386 有什么区别

java - 等待进程执行结束