Pergunta

Eu tenho visto muitos aplicativos que ter aulas de instrumento e tomar -javaagent como um param quando o carregamento também colocar um -noverify à linha de comando.

O doc Java diz que transforma -noverify a verificação classe.

No entanto por que alguém iria querer desativar a verificação, mesmo que sejam instrumentar as classes?

Foi útil?

Solução

Start-up tempo, eu diria. Verificação de que as classes estão corretos leva algum tempo quando a classe é carregada. Desde aulas pode ser carregado em uma forma preguiçosa (não no início aplicativo, mas quando está sendo usado pela primeira vez), isso pode causar atrasos de tempo de execução inesperados e indesejados.

Na verdade, a classe não precisam ser verificados em geral. O compilador não irá emitir qualquer bytecode inválida ou construção de classe. A razão para a verificação é que a classe pode ser construído em um sistema, se hospedado on-line e é transmitida a você através da internet desprotegida. Neste caminho, um invasor mal-intencionado poderia modificar o bytecode e criar algo que o compilador nunca poderia criar; algo que pode travar o JVM ou possivelmente contorna restrições de segurança. Assim, a classe é verificado antes de ser usado. Se esta é uma aplicação local, normalmente não há necessidade de verificar o bytecode novamente.

Outras dicas

Quando é usado em conjunto com -javaagent, é mais provável não por razões de desempenho, mas porque o agente cria intencionalmente "inválido" bytecode.

Deve-se notar que bytecode inválida ainda pode executar bem, porque algumas das regras de verificação são muito rigorosas. Por exemplo, this não deve ser acessado em um construtor antes da super-construtor foi chamado, porque as variáveis ??não são inicializados neste momento. Mas ainda pode haver outras coisas que você quer fazer (veja o exemplo JRebel). Em seguida, utilize -noverify para contornar essa regra.

Depuração! Na verdade isso é o que eu estou fazendo agora, e como me deparei com esta questão. No Terracotta fazemos um monte de instrumentação bytecode, e às vezes ele ajuda a desligar o verificador como depurar nossos adaptadores de classe, para que possamos ver onde exatamente eles falham em tempo de execução.

Você tem razão, queremos que o verificador de permanecer no na produção.

Usando JRebel sem -noverify dará este aviso na inicialização:

JRebel: '-noverify' desaparecidos, alterar / adicionar / remover construtores não será habilitado

Assim, parece que -noverify permite bytecode re-instrumentação para fazer algumas coisas que de outra forma não seria possível.

Inicie o tempo utilizado para ser um pouco de um problema. No entanto, os verificadores são agora mais rápido, assim como os processadores. Código compilado com JDK6 vontade javac por padrão incluem informação extra para fazer o passo verificador mais rápido. Apache Harmony apenas usa um algoritmo muito mais rápido verificação.

Algumas versões muito antigas da javac produzido bytecode incorreta. Na verdade, a Sun PlugIn ainda inclui código de correção-up para fazer alguns arquivos de classe quebrados verificar.

O novo verificador que é introduzida no Java 6 é muito complicado processo para manipulações de código.

Dê uma olhada nisso: http: // chrononsystems .com / blog / java-7-design-flaw-leva-a-grande-backward-passo-for-the-jvm

eo relatório de bug relacionado: http://bugs.sun.com/view_bug.do?bug_id=8009595

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top