Как вы терпите крах JVM?

iOS имеет разные пределы.

Используя симулятор iOS 7, я смог продемонстрировать, что предел равен 5 МБ следующим образом:

var canvas = document.createElement('canvas');
canvas.width = 1024 * 5;
canvas.height = 1024;
alert(canvas.toDataURL('image/jpeg').length);
// prints "110087" - the expected length of the dataURL

, но если я подниму размер холста вверх с помощью одной строки пикселей:

var canvas = document.createElement('canvas');
canvas.width = 1024 * 5;
canvas.height = 1025;
alert(canvas.toDataURL('image/jpeg'));
// prints "data:," - a broken dataURL
141
задан Ciro Santilli 新疆改造中心996ICU六四事件 21 February 2015 в 18:54
поделиться

16 ответов

Самая близкая вещь к единственному "ответу" System.exit(), который сразу завершает JVM без надлежащей очистки. Но кроме этого, собственный код и исчерпание ресурса являются наиболее вероятными ответами. Кроме того, можно пойти, считая средство отслеживания ошибки Sun для ошибок в версии JVM, некоторые из которых допускают повторяемые сценарии катастрофического отказа. Мы раньше получали полурегулярные катастрофические отказы при приближении к пределу памяти на 4 Гбита под 32-разрядными версиями (мы обычно используем 64-разрядный теперь).

6
ответ дан piet.t 21 February 2015 в 18:54
поделиться

Если бы Вы изменяете то большое количество для цикла к рекурсивному вызову той же функции, то Вы получили бы исключение из-за переполнения стека:

public static void main(String[] args) {
    causeStackOverflow();
}

public void causeStackOverflow() {
    causeStackOverflow();
}
-1
ответ дан Mike Stone 21 February 2015 в 18:54
поделиться

Зависит от того, что Вы подразумеваете под катастрофическим отказом.

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

можно также использовать JNI для вызова собственного кода. Если Вы не делаете этого просто прямо тогда, можно заставить его отказать трудно. Отладка тех катастрофических отказов является "забавой" (доверяйте мне, я должен был записать рак ++ DLL, который мы называем от апплета Java со знаком).:)

10
ответ дан Herms 21 February 2015 в 18:54
поделиться

Идеальная реализация JVM никогда не будет отказывать.

Для катастрофического отказа JVM, кроме JNI, необходимо найти ошибку в самом VM. Бесконечный цикл просто использует ЦП. Бесконечно выделение памяти должно правое дело OutOfMemoryError в хорошо созданной JVM. Это, вероятно, вызвало бы проблемы для других потоков, но хорошая JVM все еще не должна отказывать.

, Если можно найти ошибку в исходном коде VM, и например вызвать отказ сегментации в использовании памяти реализации VM, тогда можно на самом деле разрушить его.

15
ответ дан Dave L. 21 February 2015 в 18:54
поделиться

Книжная виртуальная машина Java Jon Meyer имеет пример ряда инструкций по байт-коду, которые вызвали JVM к дампу ядра. Я не могу найти свою копию этой книги. Если у кого-либо там есть тот, ищите его и отправьте ответ.

6
ответ дан reevesy 21 February 2015 в 18:54
поделиться

JNI. На самом деле, с JNI, катастрофический отказ является режимом по умолчанию операции. Необходимо работать дополнительные трудно, чтобы заставить его не отказывать.

123
ответ дан Dan Dyer 21 February 2015 в 18:54
поделиться

вот подробное объяснение на том, что вызывает JVM к дампу ядра (т.е. катастрофический отказ): http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_17534

4
ответ дан 21 February 2015 в 18:54
поделиться

на winxpsp2 w/wmp10 jre6.0_7

Desktop.open (uriToAviOrMpgFile)

Это заставляет порожденный поток бросать непойманный Throwable и горячую точку катастрофических отказов

YMMV

5
ответ дан 21 February 2015 в 18:54
поделиться

Если Вы определяете катастрофический отказ как аварийное прекращение работы процесса из-за необработанной ситуации (т.е. никакое Исключение Java или Ошибка), то это не может быть сделано из Java (если у Вас нет разрешения использовать sun.misc. Небезопасный класс). Это смысл управляемого кода.

Типичные катастрофические отказы в собственном коде происходят путем разыменования указателей на неправильные области памяти (пустой адрес или неправильно выровненный). Другой источник мог быть недопустимыми машинными командами (коды операций) или необработанные сигналы из библиотеки или вызовов ядра. Оба могут быть инициированы, если JVM или системные библиотеки имеют ошибки.

, Например, JITed (сгенерированный) код, собственные методы или системные вызовы (графический драйвер) могут иметь проблемы при продвижении к реальным катастрофическим отказам (было довольно распространено получить катастрофический отказ, когда Вы использовали функции ZIP, и у них закончилась память). В тех случаях обработчик катастрофических отказов JVM вталкивает и выводит состояние. Это могло также генерировать файл ядра ОС (доктор Watson в Windows, и дамп ядра на *отклоняют).

На Linux/Unix можно легко заставить JVM отказать путем отправки ему Сигнала в рабочий процесс.Примечание: Вы не должны использовать SIGSEGV для этого, так как Горячая точка ловит этот сигнал и повторно бросает его как NullPointerException в большинстве мест. Таким образом, лучше отправить SIGBUS, например.

4
ответ дан eckes 21 February 2015 в 18:54
поделиться

Я не назвал бы бросок OutOfMemoryError или StackOverflowError катастрофическим отказом. Это просто нормальные исключения. Для реального катастрофического отказа VM существует 3 пути:

  1. Использование JNI и катастрофический отказ в собственном коде.
  2. , Если никакой менеджер безопасности не установлен, можно использовать отражение для катастрофического отказа VM. Это VM конкретный, но обычно VM хранит набор указателей на собственные ресурсы в частных полях (например, указатель на собственный объект потока хранится в длинном поле в java.lang. Поток ). Просто измените их через отражение, и VM откажет рано или поздно.
  3. Все VMs имеют ошибки, таким образом, просто необходимо инициировать тот.

Для последнего метода у меня есть короткий пример, который разрушит Горячую точку Sun VM, тихий приятно:

public class Crash {
    public static void main(String[] args) {
        Object[] o = null;

        while (true) {
            o = new Object[] {o};
        }
    }
}

Это приводит к переполнению стека в GC, таким образом, Вы не получите StackOverflowError, но реального катастрофического отказа включая hs_err* файл.

172
ответ дан ralfs 21 February 2015 в 18:54
поделиться

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

0
ответ дан 23 November 2019 в 23:01
поделиться

JNI является крупным источником сбоев. Вы также можете аварийно завершить работу, используя интерфейс JVMTI, так как он также должен быть написан на C / C ++.

3
ответ дан 23 November 2019 в 23:01
поделиться

If you want to pretend you have run out of memory you can do

public static void main(String[] args) {
    throw new OutOfmemoryError();
}

I know a couple of way to cause the JVM dump an error file by calling native methods (ones which are built in), but its probably best you not know how to do this. ;)

3
ответ дан 23 November 2019 в 23:01
поделиться

Сломанное оборудование может привести к сбою любой программы. Однажды я воспроизводил аварийное завершение работы приложения на определенной машине, а на других машинах с точно такой же настройкой он работал нормально. Оказывается, у машины был сбой ОЗУ.

5
ответ дан 23 November 2019 в 23:01
поделиться

Используйте это:

import sun.misc.Unsafe;

public class Crash {
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    public static void crash() {
        unsafe.putAddress(0, 0);
    }
    public static void main(String[] args) {
        crash();
    }
}

Этот класс должен находиться в пути к загрузочному классу, потому что он использует доверенный код, поэтому запустите его следующим образом:

java -Xbootclasspath / p :. Сбой

56
ответ дан 23 November 2019 в 23:01
поделиться

Этот код приведет к аварийному завершению работы JVM

import sun.dc.pr.PathDasher; 

public class Crash
{
     public static void main(String[] args)
     {    
        PathDasher dasher = new PathDasher(null) ;
     }
}
20
ответ дан 23 November 2019 в 23:01
поделиться
Другие вопросы по тегам:

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