Java崩溃Windows

问题描述:

我一直在使用J2EE和Derby数据库开发Java应用程序。我的老板完成了大部分的测试,而且我完成了大部分的编码工作,但他遇到了一个奇怪的问题。他声称偶尔Java应用程序“崩溃他的电脑”。Java崩溃Windows

要提及一些细节,首先让我说我目前正在远程工作,所以当这些“崩溃”发生时我无法在身边。其次,我使用OS X 10.6,他使用Windows XP(我相信SP3)。有问题的Java应用程序不使用任何JNI或任何奇怪的东西,除了嵌入式Derby数据库。最后,他说它冻结了Windows中的所有内容(他的鼠标甚至没有移动) - 它不会像未捕获的异常一样显示在控制台中。

那么,有可能我的Java程序崩溃了他的电脑?我不认为Java代码可能会在JVM之外产生任何系统级的影响。这是否可能是我的程序的错误,或者我应该忽略它并将其归因于他的计算机出现问题?

+0

J2EE是一个相当广泛的(和旧的)术语。你是否想要说一个Java(JSP/Servlet)Web应用程序?如果是这样,那么测试结果如何?用网页浏览器?如果是这样,哪一个?是否还有一些JavaScript涉及?如果是这样,我也会注意到这一点。 – BalusC 2010-01-07 22:10:00

+1

它的J2EE只是在我使用javax.persistence,其他所有东西都是swing – twolfe18 2010-01-08 00:23:55

对于Java应用程序崩溃运行的操作系统,JVM中必须存在一个错误。这表示有,可以给同样的印象情况:

  • Java应用程序的操作系统启动交换和其他应用程序出现减速至停止
  • 的Java应用程序可以增加它的堆远远不够抓住所有CPU由一个或多个线程在紧张繁忙的循环

如果你可以设置测试人员的机器,使堆转储可能出现问题时被触发,你可以分析远程倾倒。例如在alphaworks上找到IBM的Java heap analyzer

+0

的意义上说,或者操作系统可能会单独变得不稳定,Java只是简单地挑剔一些额外的硬件,否则就是在做完全正确的事情。 – PSpeed 2010-01-07 22:26:31

+1

或者操作系统可能是完全稳定的,@ rsp的回应是完全准确的。 – 2010-01-07 23:06:16

+0

我并不反对他的选择......只是增加一个。根据我个人的经验,Java很多时候都是通过蓝屏来屏蔽Windows的,这是因为Windows安装或硬件错误。我的Java蓝屏有一个内存不好的盒子,我的Java蓝屏有一个盒子,里面有可恶的网络驱动,坏的显卡驱动等等。 – PSpeed 2010-01-08 18:56:41

由于图形驱动程序不正确,在IBM Thinkpads(以及其他机器上)的Windows下发生崩溃之前就有过这种情况。我建议通常的做法是确保司机是最新的,以确保安全。

虽然你的代码可能不直接使用JNI,但很多底层可能发生的事情(基本上与底层操作系统集成的任何东西)。这意味着司机可能是一个大问题。另一件事就是确保使用最新版本的Java(如果1.6_17最终不能使用Java版本的最新版本)。

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

+0

它有趣,你提到thinkpad,这就是他正在运行。我认为你可能是对的,这是一个驱动程序问题,但说实话,我只是想知道我的程序是否可以做到这一点(听起来像不是)。 – twolfe18 2010-01-08 00:25:56

+0

不好直接。 thinkpad问题最终是directx问题,其中directx被Java大量使用,其中没有其他应用程序大量使用它,因此暴露了驱动程序中的潜在错误。 – TofuBeer 2010-01-08 00:53:36

他说,这在Windows冻结一切(他的鼠标不连招)

用户模式应用 - 无论是Java或以其他方式 - 不能这样做,对一个现代操作系统像WINNT 。

他要么有硬件问题,要么是坏的驱动程序。

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

第一点:在我的XP,SP3系统上,当任何程序运行完全倾斜时,它几乎锁定了计算机。当我的防病毒程序检查更新时,其他任何事情都会停止以实现所有目的,并且它使用的CPU很少(似乎一直在写入磁盘)。我自己的无限循环,使用100%的CPU,也有类似的效果。 (为什么任务管理器不超过“标准”优先级的用户程序,我不知道获得优先权。)

点二:在任何计算机上我曾经使用过,重分页会带来一个程序的几乎完全停止。

因此,从具有512Mb真实内存和2000Mb虚拟内存的XP计算机开始。用1400Mb的数组和其他数据结构编写一个Java程序。放入一个重复数十亿次的循环,并在每次执行时读取或写入1400Mb中的每个字节。直到宇宙崩溃之后,这个计划才会结束。电脑什么都不做。我没有尝试过这一点,我也不打算这样做,但我敢打赌,即使鼠标不动,我也会下注。根据电脑的不同,唯一的修复方法可能是将电源插头从电源插座拔出。 (注意,从技术上讲,电脑并没有崩溃,事实上,它工作得很好,但你需要耐心等待,在你打算点击前一天移动鼠标。)

这个故事的寓意是为了避免XP和虚拟内存,但如果你必须处理这两个问题,请注意这些问题。

崩溃整个计算机,试试这个:

public void crashComputer() { 
    while(true) 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while(true) { 
        crashComputer(); 
       } 
      } 
     }).start(); 
} 

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

的crashComputer功能大约需要2秒崩溃整个计算机。您可以通过按住电源按钮来防止它崩溃。

crashJVM函数通过重载堆栈导致堆栈溢出(这是本网站名称的来源),从而导致JVM崩溃。

警告:使用需要您自担风险。这不会损害您的电脑,但如果您忘记点击保存文档或其他内容,我不会承担责任。