Java程序会崩溃吗?

时间:2010-05-19 08:15:40

标签: java c++ crash

我是一名c ++程序员,我对Java知之甚少。我知道java程序员不必像C ++一样直接使用内存。我也知道C ++应用程序中的大多数崩溃都是由于内存损坏。

因为与内存相关的问题,用Java编写的应用程序会崩溃吗?

由于

12 个答案:

答案 0 :(得分:49)

与其他一些答案相反,我会声称Java程序会经常崩溃,甚至可能比C ++程序更多

通过“崩溃”,大多数人都知道程序遇到的错误未得到妥善处理,导致应用程序终止。嗯,这当然会发生,并且与Java处理内存的方式无关。

这是的事情。是什么让C ++变得如此危险,Java相对安全,恰恰是Java 在C ++很乐意继续运行的情况下崩溃这一事实,尽管做了非常错误和潜在危险的事情(比如写入未初始化的)内存,溢出缓冲区,...)。 Java的崩溃(例如抛出异常)可以防止更严重的破坏。另一方面,C ++应用程序(由于未能在错误上终止)可能会损坏外部数据或系统。或者他们可能只是提供了一个错误的(但看似合理的)结果。

这是针对这些危险的Java保护,而不是反对崩溃本身

答案 1 :(得分:16)

java可能会崩溃。

原因可能是......

OutOfMemoryError
StackoverFlowError
OutOfMemoryError: PermGen space.

<强>的OutOfMemoryError 当Java虚拟机因内存不足而无法分配对象时抛出,垃圾收集器不再提供更多内存。

<强>的StackOverflowError 抛出执行堆栈溢出错误的StackOverflowException,通常是在非常深或无限递归的情况下。

OutOfMemoryError:PermGen space 详细消息PermGen空间表示永久代已满。永久生成是堆的区域,其中存储类和方法对象。如果应用程序加载了大量类,则可能需要使用-XX:MaxPermSize选项增加永久代的大小。

问题是关于可能导致崩溃的内存问题。

可能导致崩溃的其他问题,但可以被程序捕获并从 posibilty 恢复 是任何runtimeExceptions。 即

  

ArithmeticException,   ArrayStoreException信息,   BufferOverflowException,   BufferUnderflowException,   CannotRedoException,   CannotUndoException,   ClassCastException,CMMException,   ConcurrentModificationException的,   DOMException,EmptyStackException,   抛出:IllegalArgumentException,   抛出:IllegalMonitorStateException,   IllegalPathStateException,   IllegalStateException异常,   ImagingOpException,   IndexOutOfBoundsException异常,   MissingResourceException异常,   NegativeArraySizeException,   NoSuchElementException异常,   空指针异常,   ProfileDataException,   ProviderException,   抛出:RasterFormatException,   SecurityException,SystemException,   UndeclaredThrowableException中,   UnmodifiableSetException,   UnsupportedOperationException异常

我不会在这里进入这些。但看看...... link text

答案 2 :(得分:8)

是的,它可以:)

public void test() {
    test();
}

这会因StackoverFlowError而崩溃。还有其他几个 - 例如,内存不足也会导致崩溃(OutOfMemoryError)。

答案 3 :(得分:2)

C ++中的内存损坏不仅仅发生。它们是由软件错误引起的,比如写过数组的末尾。这样做也会导致Java崩溃。 (没有语言会包含包含错误的源代码,并生成一个符合您最初目的的程序。)不同之处在于,在C ++中,您会得到“未定义的行为”,即程序可能会在其他地方崩溃。当您尝试写入数组末尾时,Java程序将崩溃,这使得查找错误变得更加容易。

答案 4 :(得分:1)

Java程序一直在崩溃。我遇到的最常见的原因是内存耗尽和未处理的异常。

答案 5 :(得分:1)

当然他们会崩溃:)

除了所有优秀的答案外,还有简单明了的JVM崩溃。例如,这是一个我问过的关于JVM损坏的问题,我可以使用特定的数据集可靠地崩溃(这不是我的错:这个“不应该”发生......但它确实;)

我看到服务器端JVM在一些奇怪的情况下崩溃了(Tomcat + Hibernate + Sun VM问题,在过去的日子里,通过更改Tomcat或Sun VM来修复它们。) / p>

我已经看到桌面端的JVM在它们不应该崩溃的时候崩溃(将商业Java软件运送到很多台式机上往往会增加你见证这种事情的可能性)。

我见过的最好的是JVM简单破碎,我可以在几台机器上工作时可靠地崩溃,不,机器不是都有问题,它们是坚如磐石的坚固工作站(自那篇文章以来) ,我试过几台机器,我可以重现它):

Java VM: reproducable SIGSEGV on both 1.6.0_17 and 1.6.0_18, how to report?

(请注意,在同一台机器上有很多其他JVM,使用相同的软件/数据集)。

当我目睹JVM崩溃时,我做的第一件事就是改变其中一个软件组件:通常将JVM升级到最新版本。

答案 6 :(得分:0)

  

所以用Java编写的应用程序会   永远不会因内存相关而崩溃   问题。

OutOfMemoryError肯定是与内存相关的问题。此外,当遇到JVM中的错误(通常用C或C ++编写)或者存在硬件问题(例如坏RAM)时,您可能会遇到“真正的”崩溃(段错误)。可能还会在未对其进行验证的JVM上运行无效字节码(例如嵌入式系统的JVM)。

但通常,是的,Java程序不会发生段错误。

答案 7 :(得分:0)

没有。 Java应用程序可能因内存问题而崩溃。虽然Java确实有内置的内存管理,但它绝不是完美的。只是为你做了很多艰苦的工作。

正如其他一些答案中所提到的,Java确实有一个相当特殊的内存分配系统,它涉及相当多的手动管理,如果你不小心并且没有它,实际上很容易用尽这个分配它为您的应用程序正确设置。

(参见Java的-Xmx和-Xms参数)

答案 8 :(得分:0)

虽然JVM本身不太可能崩溃,但是你的程序完全有可能因内存相关问题而崩溃,例如内存泄漏通过永远不会超出范围的对象。

编辑: JVM是一个高度优化的平台,虽然错误很少见,但它们偶尔也会出现,当然,正如其他人在这里提到的那样,如果您遇到硬件问题,在corruped I / O或RAM中,JVM可以并且将会死亡)

答案 9 :(得分:0)

此程序将抛出OutOfMemoryException并崩溃。

void crash(List list) {
   while (true) {
      list.add(new Object());
   }
}

答案 10 :(得分:0)

严重的崩溃看起来像是:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00000000, pid=3387, tid=166603048020
#
# JRE version: 6.0_14-b08
# Java VM: Java HotSpot(TM) Server VM (14.0-b16 mixed mode linux-x86 )
# Problematic frame:
# C  0x00000000
#
# An error report file with more information is saved as:
# .....hs_err_pid3387.log

这不是导致这个的java程序,它是vm本身的代码。这几年以来非常罕见。

答案 11 :(得分:0)

如果你想测试如果JVM真的崩溃会发生什么,试试这个功能(我用它来测试我的崩溃处理程序:)。不在安全环境或非Sun JDK上运行。

/**
 * Crashes the JVM, by copying 1 byte from address 1 to address 1. If this did
 * not crash the machine already, we copy a byte from -1 to -1 :). Never call 
 * this except for debugging problems related  to handling system crashes.
 */
public static void crash() {        
    Unsafe unsafe;
    try {
        Field field = Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        unsafe = (Unsafe)field.get(null);
    } catch (Exception ex) {
        throw new RuntimeException("Can't get Unsafe instance to crash app.", ex);
    }
    log.fatal("Here we are and say good bye, the app ist now about to die...");
    // Crash now!
    unsafe.copyMemory(1,1,1);
    // Still alive? Than the following line will help... Crash now!
    unsafe.copyMemory(-1,-1,1);
}