Подтвердить что ты не робот

Сбой программы Java?

Я программист на С++, я немного разбираюсь в java. Я знаю, что Java-программистам не нужно работать с памятью, как С++. Я также знаю, что большинство сбоев при использовании С++ связано с повреждением памяти.

Так может ли приложение, написанное в результате сбоя Java из-за проблемы с памятью?

Спасибо

4b9b3361

Ответ 1

В отличие от некоторых других ответов, я надеюсь, что программы Java будут разбиваться так часто или, возможно, даже чаще, чем на С++-программы.

В результате "сбоя" большинство людей понимает, что программа обнаруживает ошибку, которая не обрабатывается должным образом, в результате чего приложение завершается. Ну, это, конечно, происходит и не имеет никакого отношения к тому, как Java обрабатывает память.

Это хорошо. Что делает С++ настолько опасным, а Java сравнительно безопасным, это именно тот факт, что Java будет разбиваться в случаях, когда С++ будет продолжать работать, хотя и делает очень неправильные и потенциально опасные вещи (например, запись в неинициализированную память, переполнение буферов...), Javas crashing (например, исключение бросания) предотвращает худший урон. C++-приложения, с другой стороны (из-за отказа при завершении ошибок), могут нанести ущерб внешним данным или системе. Или они могут просто доставить неправильный (но кажущийся правдоподобный) результат.

Его против этих опасностей, которые Java защищает, а не от сбоев как таковых.

Ответ 2

может произойти сбой java.

Причиной может быть..

OutOfMemoryError
StackoverFlowError
OutOfMemoryError: PermGen space.

OutOfMemoryError Брошено, когда виртуальная машина Java не может выделить объект, потому что он неактивен, и сборщик мусора не может сделать доступной больше памяти.

StackOverflowError StackOverflowException вызывается для ошибок выполнения, как правило, в случае очень глубокой или неограниченной рекурсии.

OutOfMemoryError: пространство PermGen Детальное сообщение PermGen space указывает, что постоянное поколение заполнено. Постоянное поколение - это область кучи, где хранятся объекты класса и метода. Если приложение загружает очень большое количество классов, то размер постоянного поколения может потребоваться увеличить с помощью опции -XX: MaxPermSize.

Вопрос был о проблемах памяти, которые могут вызвать сбой.

Другие проблемы, которые могут вызвать сбой, но могут быть пойманы программой и восстановлены из posibilty являются исключениями времени выполнения. т.е.

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

Я не буду вдаваться в них здесь. но посмотрите... текст ссылки

Ответ 3

да, он может:)

public void test() {
    test();
}

произойдет сбой с помощью StackoverFlowError. есть и некоторые другие - например, нехватка памяти также приведет к сбою (OutOfMemoryError).

Ответ 4

Коррупции памяти на С++ не просто происходят. Они вызваны ошибками программного обеспечения, такими как запись за конец массива. Это приведет к сбою на Java. (Ни один язык не будет использовать исходный код, содержащий ошибку, и создать программу, которая делает то, что вы намеревались изначально.) Разница заключается в том, что в С++ вы получаете "поведение undefined", то есть программа может сбой в другом месте. Программа Java выйдет из строя в тот момент, когда вы попытаетесь написать за конец массива, что значительно облегчает поиск ошибки.

Ответ 5

Программы Java постоянно сбой. Наиболее распространенными причинами, с которыми я сталкиваюсь, являются изнурение памяти и необработанные исключения.

Ответ 6

Конечно, они сбой:)

В дополнение ко всем тонким ответам, там также простой и простой JVM аварии. Например, вот вопрос, который я задал в отношении случая сломанной JVM, который я могу достоверно сбой с использованием определенного набора данных (и это не моя ошибка: это "не должно" произойти... Но это делает;)

Я видел сбои JVM на стороне сервера под некоторыми странными обстоятельствами (Tomcat + Hibernate + Sun VM проблема, в те дни, которые были исправлены, в те дни, путем изменения Tomcat или Sun VM).

Я видел, как JVM на стороне рабочего стола терпит крах, когда им этого не нужно (отправка коммерческого программного обеспечения Java на множество настольных компьютеров, как правило, повышает вероятность того, что вы будете свидетелями такой вещи).

И самое лучшее, что я видел, это обычная JVM-платформа, которую я могу надежно разрушить при работе на нескольких машинах, и нет, у машин нет всех проблем, они устойчивы к скалистым работам (с этой должности, Я пробовал несколько машин, и я могу воспроизвести его):

Java VM: воспроизводимый SIGSEGV на 1.6.0_17 и 1.6.0_18, как сообщить?

(обратите внимание, что существует много других JVM, которые отлично работают на одних и тех же машинах с одним и тем же программным обеспечением/набором данных).

Первое, что я вижу в случае сбоя JVM, - это изменение одного из компонентов программного обеспечения: обычно обновление JVM до последней версии.

Ответ 7

Таким образом, приложение, написанное на Java, будет никогда не сбой из-за связи памяти проблема.

OutOfMemoryError - проблема, связанная с памятью. Кроме того, вы можете получить "реальный" сбой (segfault), когда встречается ошибка в JVM (обычно это написано на C или С++) или при наличии аппаратной проблемы (например, плохой ОЗУ). Возможно также при запуске недействительного байт-кода на JVM, который не проверяет его (например, JVM для встроенных систем).

Но, как правило, да, программы Java не выполняются.

Ответ 8

Нет. Приложения Java могут вылетать из-за проблем с памятью. Хотя у Java есть встроенное управление памятью, это отнюдь не идеально. Просто для вас очень много работы.

Как уже упоминалось в некоторых других ответах, Java имеет довольно определенную систему распределения памяти, которая включает в себя довольно небольшое ручное управление, и на самом деле довольно легко исчерпать это распределение, если вы не внимательны и не имеете он правильно настроен для вашего приложения.

(См. параметры -Xmx и -Xms для Java)

Ответ 9

В то время как маловероятно, что JVM сама по себе может привести к сбою, ваша программа может столкнуться с проблемами памяти, например, из-за утечек памяти через объекты, которые никогда не выходят за рамки.

( edit: JVM - это высоко оптимизированная платформа, и хотя ошибки встречаются очень редко, они все же появляются иногда, плюс, конечно, как и другие, упомянутые здесь, если у вас есть проблемы с оборудованием, такие как поврежденный I/O или RAM, JVM может и умрет)

Ответ 10

Эта программа будет бросать OutOfMemoryException и сбой.

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

Ответ 11

Серьезная авария выглядит так:

#
# 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. Это очень редко, начиная с нескольких лет.

Ответ 12

Если вы хотите проверить, что произойдет, если 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);
}