Java崩溃窗口

Java崩溃窗口,java,windows,jvm,crash,Java,Windows,Jvm,Crash,我一直在使用J2EE和Derby数据库开发Java应用程序。我的老板负责大部分的测试,我负责大部分的编码,但他却带着一个奇怪的问题来找我。他声称Java应用程序偶尔会“使他的计算机崩溃” 提到一些细节,首先让我说,我目前正在远程工作,所以当这些“崩溃”发生时,我不能在身边。其次,我使用OSX10.6,他使用WindowsXP(我相信是SP3)。所讨论的Java应用程序除了使用嵌入式Derby数据库外,不使用任何JNI或任何奇怪的东西。最后,他说它冻结了Windows中的所有东西(他的鼠标甚至不动

我一直在使用J2EE和Derby数据库开发Java应用程序。我的老板负责大部分的测试,我负责大部分的编码,但他却带着一个奇怪的问题来找我。他声称Java应用程序偶尔会“使他的计算机崩溃”

提到一些细节,首先让我说,我目前正在远程工作,所以当这些“崩溃”发生时,我不能在身边。其次,我使用OSX10.6,他使用WindowsXP(我相信是SP3)。所讨论的Java应用程序除了使用嵌入式Derby数据库外,不使用任何JNI或任何奇怪的东西。最后,他说它冻结了Windows中的所有东西(他的鼠标甚至不动)——它不会像未捕获的异常那样出现在控制台中


那么,我的Java程序有可能会使他的计算机崩溃吗?我认为Java代码在JVM之外不会产生任何系统范围的影响。这可能是我的程序的错误,还是我应该忽略它并将其归因于他的计算机的某个问题?

如果Java应用程序要使其运行的操作系统崩溃,JVM中一定有错误。也就是说,有些情况会给人留下同样的印象:

  • Java应用程序可以将其堆扩展到足够大的程度,以至于操作系统开始交换,而其他应用程序似乎会减速到停止
  • Java应用程序可以通过紧忙循环中的一个或多个线程获取所有CPU

如果您可以设置测试人员的机器,以便在问题发生时触发堆转储,那么您可以远程分析该转储。例如,对于alphaworks上的IBM。

如果Java应用程序要使其运行的操作系统崩溃,JVM中一定有一个bug。也就是说,有些情况会给人留下同样的印象:

  • Java应用程序可以将其堆扩展到足够大的程度,以至于操作系统开始交换,而其他应用程序似乎会减速到停止
  • Java应用程序可以通过紧忙循环中的一个或多个线程获取所有CPU

如果您可以设置测试人员的机器,以便在问题发生时触发堆转储,那么您可以远程分析该转储。例如,在alphaworks上发现的IBM。以前,IBM ThinkPad(以及我确信的其他机器)上的windows下出现过由于图形驱动程序错误而导致崩溃的案例。为了安全起见,我建议做一件平常的事,确保司机是最新的

虽然您的代码可能不会直接使用JNI,但在后台发生的很多事情都可以(本质上与底层操作系统集成的任何事情)。这意味着司机可能是个大问题

另一件事是确保正在使用最新版本的Java(如果1.6_17最终不可能使用,则使用最新版本的Java)


对我来说,修复随机崩溃的另一件事是重新安置内存(拔下并重新插入)。

以前,IBM ThinkPad(以及我确信的其他机器)上的windows下出现过由于图形驱动程序错误而导致崩溃的案例。为了安全起见,我建议做一件平常的事,确保司机是最新的

虽然您的代码可能不会直接使用JNI,但在后台发生的很多事情都可以(本质上与底层操作系统集成的任何事情)。这意味着司机可能是个大问题

另一件事是确保正在使用最新版本的Java(如果1.6_17最终不可能使用,则使用最新版本的Java)

对我来说,修复随机崩溃的另一个方法是重新安置内存(拔下它并重新插入)

他说它会冻结窗口中的所有东西(他的鼠标甚至不动)

用户模式应用程序 — 不管是Java还是其他 — 不能对像WinNT这样的现代操作系统这么做

他不是硬件有问题,就是驾驶技术不好

他说它会冻结窗口中的所有东西(他的鼠标甚至不动)

用户模式应用程序 — 不管是Java还是其他 — 不能对像WinNT这样的现代操作系统这么做


他要么有硬件问题,要么驱动程序不好。

还要检查客户端(Windows/XP)系统上的页面文件空间。

还要检查客户端(Windows/XP)系统上的页面文件空间。

第一点:在我的XP、SP3系统上,当任何程序全速运行时,它几乎会锁定计算机。当我的防病毒程序检查更新时,出于所有实际目的,其他一切都会停止,并且它只使用很少的CPU(似乎一直在写入磁盘)。我自己的无限循环,使用100%的CPU,也有类似的效果。(我不知道为什么任务管理器没有优先于具有“正常”优先级的用户程序。)

第二点:在我使用过的任何计算机上,频繁的分页都会使程序几乎完全停止

因此,从拥有512Mb实际内存和2000Mb虚拟内存的XP计算机开始。编写一个包含1400Mb数组和其他数据结构的Java程序。放入一个循环,该循环重复数十亿次,每次执行时读取或写入1400Mb中的每个字节。这个计划要到宇宙崩溃很久以后才能完成。计算机什么也做不了。我没有尝试过,也不打算尝试,但我敢打赌,即使是鼠标也不会动。根据电脑的品牌,唯一的解决办法可能是将电源插头从墙上的插座中拔出。(请注意,从技术上讲,计算机并没有崩溃。事实上,它工作得很好。但您需要耐心。在计划单击的前一天移动鼠标。)


这个故事的寓意是避免使用XP和虚拟内存,但如果你必须处理其中任何一个问题,请注意这些问题。

第一点:在我的XP、SP3系统上,当任何程序全速运行时,它几乎会锁定计算机。当我的朋友
public void crashComputer() {
    while(true)
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true) {
                    crashComputer();
                }
            }
        }).start();
}

public void crashJVM() {
    while(true)
        crashJVM();
}