Я пришел сюда, потому что я также столкнулся с этим вопросом в The Passionate Programmer, Чадом Фаулером. Для тех, кто не имеет доступа к копии, вопрос оформляется как своего рода фильтр/тест для кандидатов, которые берут интервью для позиции, требующей «действительно хороших Java-программистов».
В частности, он спрашивает:
How would you write a program, in pure Java, that would cause the Java Virtual Machine to crash?
Я запрограммирован на Java более 15 лет, и я нашел этот вопрос, чтобы быть как загадочно и несправедливо. Как указывали другие, Java, как управляемый язык, специально разработан , чтобы не разбивать. Конечно, всегда есть ошибки JVM, но:
- После 15 лет работы на JRE-уровне производства это редкость.
- Любые такие ошибки, скорее всего, будут исправлены в следующей версии, так как, вероятно, вы, как программист, можете запустить и вспомнить детали текущего набора шоу-стопов JRE?
Как уже упоминалось, некоторый собственный код через JNI - это верный способ разрушить JRE. Но автор специально упомянул в чистой Java, так что это не так.
Другим вариантом будет подача байт-кодов JRE; это достаточно легко сбросить несколько мусорных двоичных данных в файл .class, и попросить JRE запустить его:
$ echo 'crap crap crap' > crap.class
$ java crap
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1668440432 in class file crap
ли это считать? Я имею в виду, что сам JRE не разбился; он правильно обнаружил фиктивный код, сообщил об этом и вышел.
Это оставляет нам самые очевидные виды решений, таких как продувка стека через рекурсию, выход из памяти кучи через выделение объектов или просто бросание RuntimeException
. Но это просто приводит к тому, что JRE выходит с StackOverflowError
или аналогичным исключением, которое, опять же, на самом деле не является крахом.
Итак, что осталось? Мне очень хотелось бы услышать, что автор действительно имел в виду как правильное решение.
Обновление: Chad Fowler responded here.
PS: это отличная книга. Я взял его за моральную поддержку, изучая Руби.
Страстный программист, да, отличная книга;) – dolzenko 2011-12-08 19:48:00
Возможный superset of: http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java – 2015-03-18 13:13:56
https://stackoverflow.com/questions/30072883/java-swing-jwindow-application-crash «Если я использую JDK1.8_40 или новее (Oracle или OpenJDK сделайте то же самое), следующий код вместе с изменением размера диалогового окна приведет к сбою приложения (попробовал Windows 7, x64, 64-битный JDK) ». Код составляет всего 40 строк, и это приводит к * правильному сбою * JVM. – 2016-01-06 11:09:35