我是一名c ++程序员,我对Java知之甚少。我知道java程序员不必像C ++一样直接使用内存。我也知道C ++应用程序中的大多数崩溃都是由于内存损坏。
因为与内存相关的问题,用Java编写的应用程序会崩溃吗?
由于
答案 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);
}