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
Самая близкая вещь к единственному "ответу" System.exit()
, который сразу завершает JVM без надлежащей очистки. Но кроме этого, собственный код и исчерпание ресурса являются наиболее вероятными ответами. Кроме того, можно пойти, считая средство отслеживания ошибки Sun для ошибок в версии JVM, некоторые из которых допускают повторяемые сценарии катастрофического отказа. Мы раньше получали полурегулярные катастрофические отказы при приближении к пределу памяти на 4 Гбита под 32-разрядными версиями (мы обычно используем 64-разрядный теперь).
Если бы Вы изменяете то большое количество для цикла к рекурсивному вызову той же функции, то Вы получили бы исключение из-за переполнения стека:
public static void main(String[] args) {
causeStackOverflow();
}
public void causeStackOverflow() {
causeStackOverflow();
}
Зависит от того, что Вы подразумеваете под катастрофическим отказом.
можно сделать бесконечную рекурсию, чтобы заставить его исчерпать стековое пространство, но это откажет "корректно". Вы получите исключение, но сама JVM будет обрабатывать все.
можно также использовать JNI для вызова собственного кода. Если Вы не делаете этого просто прямо тогда, можно заставить его отказать трудно. Отладка тех катастрофических отказов является "забавой" (доверяйте мне, я должен был записать рак ++ DLL, который мы называем от апплета Java со знаком).:)
Идеальная реализация JVM никогда не будет отказывать.
Для катастрофического отказа JVM, кроме JNI, необходимо найти ошибку в самом VM. Бесконечный цикл просто использует ЦП. Бесконечно выделение памяти должно правое дело OutOfMemoryError в хорошо созданной JVM. Это, вероятно, вызвало бы проблемы для других потоков, но хорошая JVM все еще не должна отказывать.
, Если можно найти ошибку в исходном коде VM, и например вызвать отказ сегментации в использовании памяти реализации VM, тогда можно на самом деле разрушить его.
Книжная виртуальная машина Java Jon Meyer имеет пример ряда инструкций по байт-коду, которые вызвали JVM к дампу ядра. Я не могу найти свою копию этой книги. Если у кого-либо там есть тот, ищите его и отправьте ответ.
JNI. На самом деле, с JNI, катастрофический отказ является режимом по умолчанию операции. Необходимо работать дополнительные трудно, чтобы заставить его не отказывать.
вот подробное объяснение на том, что вызывает JVM к дампу ядра (т.е. катастрофический отказ): http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_17534
на winxpsp2 w/wmp10 jre6.0_7
Desktop.open (uriToAviOrMpgFile)
Это заставляет порожденный поток бросать непойманный Throwable и горячую точку катастрофических отказов
YMMV
Если Вы определяете катастрофический отказ как аварийное прекращение работы процесса из-за необработанной ситуации (т.е. никакое Исключение Java или Ошибка), то это не может быть сделано из Java (если у Вас нет разрешения использовать sun.misc. Небезопасный класс). Это смысл управляемого кода.
Типичные катастрофические отказы в собственном коде происходят путем разыменования указателей на неправильные области памяти (пустой адрес или неправильно выровненный). Другой источник мог быть недопустимыми машинными командами (коды операций) или необработанные сигналы из библиотеки или вызовов ядра. Оба могут быть инициированы, если JVM или системные библиотеки имеют ошибки.
, Например, JITed (сгенерированный) код, собственные методы или системные вызовы (графический драйвер) могут иметь проблемы при продвижении к реальным катастрофическим отказам (было довольно распространено получить катастрофический отказ, когда Вы использовали функции ZIP, и у них закончилась память). В тех случаях обработчик катастрофических отказов JVM вталкивает и выводит состояние. Это могло также генерировать файл ядра ОС (доктор Watson в Windows, и дамп ядра на *отклоняют).
На Linux/Unix можно легко заставить JVM отказать путем отправки ему Сигнала в рабочий процесс.Примечание: Вы не должны использовать SIGSEGV
для этого, так как Горячая точка ловит этот сигнал и повторно бросает его как NullPointerException в большинстве мест. Таким образом, лучше отправить SIGBUS
, например.
Я не назвал бы бросок OutOfMemoryError или StackOverflowError катастрофическим отказом. Это просто нормальные исключения. Для реального катастрофического отказа VM существует 3 пути:
Для последнего метода у меня есть короткий пример, который разрушит Горячую точку Sun VM, тихий приятно:
public class Crash {
public static void main(String[] args) {
Object[] o = null;
while (true) {
o = new Object[] {o};
}
}
}
Это приводит к переполнению стека в GC, таким образом, Вы не получите StackOverflowError, но реального катастрофического отказа включая hs_err* файл.
Я делаю это сейчас, но не совсем уверен, как ... :-) JVM (и мое приложение) иногда просто полностью исчезают. Нет ошибок, ничего не регистрируется. Переходит от работы к тому, чтобы вообще не бегать без предупреждения.
JNI является крупным источником сбоев. Вы также можете аварийно завершить работу, используя интерфейс JVMTI, так как он также должен быть написан на C / C ++.
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. ;)
Сломанное оборудование может привести к сбою любой программы. Однажды я воспроизводил аварийное завершение работы приложения на определенной машине, а на других машинах с точно такой же настройкой он работал нормально. Оказывается, у машины был сбой ОЗУ.
Используйте это:
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 :. Сбой
Этот код приведет к аварийному завершению работы JVM
import sun.dc.pr.PathDasher;
public class Crash
{
public static void main(String[] args)
{
PathDasher dasher = new PathDasher(null) ;
}
}