gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:21:05 24 4
gpt4 key购买 nike

我正在运行 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com