Я пришел сюда, потому что я также столкнулся с этим вопросом в Страстный программист Чеда Фаулера. Для тех, у кого нет доступа к копии, вопрос оформлен в виде своего рода фильтра / теста для собеседования кандидатов на должность, требующую «действительно хороших Java-программистов».
В частности, он спрашивает:
Как бы вы написали программу на чистом Java, которая вызывала бы сбой виртуальной машины Java?
Я программировал на Java более 15 лет, и я нашел этот вопрос одновременно и загадочным, и несправедливым. Как уже отмечали другие, Java, как управляемый язык, специально предназначен , чтобы не аварийно завершать работу . Конечно, всегда есть ошибки JVM, но:
- После 15+ лет JRE производственного уровня, это редко.
- Любые такие ошибки, вероятно, будут исправлены в следующем выпуске, так какова вероятность того, что вы, как программист, столкнетесь и вспомните детали текущего набора JRE show-stoppers?
Как уже упоминали другие, некоторый нативный код через 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
или аналогичным исключением, которое, опять же, на самом деле не является сбоем .
Так что же осталось? Мне бы очень хотелось услышать, что автор действительно имел в виду как правильное решение.
Обновление : Чед Фаулер ответил здесь .
PS: в остальном это отличная книга. Я взял это для моральной поддержки, изучая Руби.