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