Программы Java когда-либо отказывают?

Наконец нашел ответ после нескольких попыток. Ответ специфичен для использования искро-ЦСВ-банки. Создайте папку на жестком диске D: \ Spark \ spark_jars. Поместите там следующие банки:

  1. spark-csv_2.10-1.4.0.jar (это версия, которую я использую)
  2. commons-csv-1.1.jar
  3. univocity-parsers-1.5.1.jar

2 и 3 - зависимости, требуемые от spark-csv, поэтому эти два файла также должны быть загружены. Перейдите в каталог conf, где вы загрузили Spark. В файле spark-defaults.conf добавьте строку:

spark.driver.extraClassPath D: / Spark / spark_jars / *

Звездочка должна содержать все банки. Теперь запустите Python, создайте SparkContext, SQLContext, как обычно. Теперь вы должны использовать искру-csv как

sqlContext.read.format('com.databricks.spark.csv').\
options(header='true', inferschema='true').\
load('foobar.csv')
26
задан rook 19 May 2010 в 08:31
поделиться

12 ответов

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

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

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

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

49
ответ дан 28 November 2019 в 06:20
поделиться

Java может потерпеть крах.

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

OutOfMemoryError
StackoverFlowError
OutOfMemoryError: PermGen space.

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

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

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

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

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

ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

Я не буду вдаваться в эти здесь. но взгляните на ... текст ссылки

16
ответ дан jeff porter 28 November 2019 в 06:20
поделиться

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

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

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

0
ответ дан AllenJB 28 November 2019 в 06:20
поделиться

Эта программа выдаст OutOfMemoryException и вылетит.

void crash(List list) {
   while (true) {
      list.add(new Object());
   }
}
0
ответ дан fastcodejava 28 November 2019 в 06:20
поделиться

Если вы хотите проверить, что произойдет, если JVM действительно выйдет из строя, попробуйте эту функцию (я использую ее для проверки моих обработчиков сбоя :) Работает не в безопасных средах и не в JDK Sun.

/**
 * 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);
}
0
ответ дан Daniel 28 November 2019 в 06:20
поделиться

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

2
ответ дан 28 November 2019 в 06:20
поделиться

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

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

0
ответ дан 28 November 2019 в 06:20
поделиться

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

OutOfMemoryError , безусловно, связана с памятью. Более того, вы можете получить «настоящий» сбой (segfault) при обнаружении ошибки в JVM (которая обычно написана на C или C ++) или при наличии аппаратной проблемы (например, плохой RAM). Возможно также, когда вы запускаете недопустимый байт-код на JVM, которая не проверяет его (например, JVM для встроенных систем).

Но обычно, да, программы на Java не работают с ошибками.

0
ответ дан 28 November 2019 в 06:20
поделиться

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

#
# 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-программа, а код самой виртуальной машины. Это очень редко, вот уже несколько лет.

0
ответ дан 28 November 2019 в 06:20
поделиться

да, может :)

public void test() {
    test();
}

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

8
ответ дан 28 November 2019 в 06:20
поделиться

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

1
ответ дан 28 November 2019 в 06:20
поделиться

Конечно, они разбиваются :)

В дополнение ко всем этим прекрасным ответам, есть также простой и понятный сбой 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 до последней версии.

1
ответ дан 28 November 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: