Eu vim aqui porque também me deparei com essa pergunta no The Passionate Programmer , de Chad Fowler. Para aqueles que não têm acesso a uma cópia, a pergunta é formulada como uma espécie de filtro / teste para candidatos que entrevistam para uma posição que exige "realmente bons programadores de Java".
Especificamente, ele pergunta:
Como você escreveria um programa, em Java puro, que causaria uma falha na Java Virtual Machine?
Programei em Java por mais de 15 anos e achei essa pergunta intrigante e injusta. Como outros já apontaram, o Java, como linguagem gerenciada, é projetado especificamente para não falhar . Obviamente, sempre existem erros da JVM, mas:
- Após mais de 15 anos de JREs no nível de produção, é raro.
- É provável que algum desses erros seja corrigido na próxima versão, então qual é a probabilidade de você, como programador, encontrar e recuperar os detalhes do conjunto atual de interruptores de exibição do JRE?
Como outros já mencionaram, algum código nativo via JNI é uma maneira de travar um JRE. Mas o autor mencionado especificamente em Java puro , então está pronto.
Outra opção seria alimentar os códigos de bytes falsos do JRE; é fácil despejar alguns dados binários de lixo em um arquivo .class e pedir ao JRE para executá-lo:
$ echo 'crap crap crap' > crap.class
$ java crap
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1668440432 in class file crap
Isso conta? Quero dizer, o próprio JRE não caiu; ele detectou corretamente o código falso, relatou e saiu.
Isso nos deixa com os tipos mais óbvios de soluções, como explodir a pilha por recursão, ficar sem memória heap por meio de alocações de objetos ou simplesmente jogar RuntimeException
. Mas isso apenas faz com que o JRE saia com uma StackOverflowError
exceção ou similar, o que novamente não é realmente um acidente .
Então o que resta? Eu adoraria ouvir o que o autor realmente tinha em mente como uma solução adequada.
Atualização : Chad Fowler respondeu aqui .
PS: é um livro ótimo. Eu peguei o suporte moral enquanto aprendia Ruby.