【问题标题】:Java Crashing WindowsJava 崩溃窗口
【发布时间】:2010-01-07 22:07:35
【问题描述】:

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

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

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

【问题讨论】:

  • J2EE 是一个相当宽泛(且古老)的术语。您是说 Java (JSP/Servlet) Web 应用程序吗?如果是这样,那是如何测试的?使用网络浏览器?如果有,是哪一个?是否还涉及一些Javascript?如果是这样,我也会注意这一点。
  • 它的 J2EE 只是在我使用 javax.persistence 的意义上,其他一切都是摇摆不定的

标签: java windows jvm crash


【解决方案1】:

如果 Java 应用程序导致其运行的操作系统崩溃,那么 JVM 中肯定存在错误。也就是说,有些情况可能会给人同样的印象:

  • Java 应用程序可以将其堆增长到足以使操作系统开始交换并且其他应用程序似乎减速到停止
  • Java 应用程序可以在一个紧凑的繁忙循环中通过一个或多个线程获取所有 CPU

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

【讨论】:

  • 或者操作系统可能是单独不稳定的,Java 只是加倍努力,但在其他方面做的是完全正确的事情。
  • 或者操作系统完全稳定,@rsp 的响应完全准确。
  • 我并没有不同意他的选择......只是添加了一个。根据我的个人经验,每次 Java 都会蓝屏 Windows 框,这是因为 Windows 安装错误或硬件错误。我有一个内存坏的 Java 蓝屏框,我有一个带有不可靠网络驱动程序、坏图形驱动程序等的 Java 蓝屏框。
  • 请注意“他的鼠标甚至不动”...不仅仅是一台繁忙的机器。如果发生这种情况,还要检查键盘numlock 灯是否仍与numlock 键切换。如果不是,则 Windows 是硬锁定的。
【解决方案2】:

之前有过由于显卡驱动程序错误而导致 IBM Thinkpad(以及我确定的其他机器)在 Windows 下崩溃的情况。我建议做通常的事情,确保驱动程序是最新的,只是为了安全起见。

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

另一件事是确保使用的是最新版本的 Java(如果 1.6_17 最终无法使用最新版本的 Java 版本)。

为我解决随机崩溃的另一件事是重新安装内存(拔下并重新插入)。

【讨论】:

  • 你提到 thinkpad 很有趣,这就是他正在运行的东西。我认为您可能是对的,这是一个驱动程序问题,但老实说,我只是想知道我的程序是否可以做到这一点(听起来不像)。
  • 不直接。 thinkpad 问题最终是一个 Directx 问题,Java 大量使用 Directx,而没有其他应用程序以这种方式大量使用它,因此它暴露了驱动程序中的一个潜在错误。
【解决方案3】:

他说它会冻结 Windows 中的所有内容(他的鼠标甚至不动)

用户模式应用程序 — 无论是 Java 还是其他方式 — 无法针对 WinNT 等现代操作系统执行此操作。

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

【讨论】:

    【解决方案4】:

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

    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崩溃,导致堆栈溢出(这就是本网站名称的由来)。

    警告:使用风险自负。这不会损坏您的计算机,但如果您忘记单击文档或其他内容上的保存,我不会承担任何责任。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-14
          • 2014-06-22
          • 1970-01-01
          • 2018-06-14
          • 1970-01-01
          • 2013-12-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多