Use de -noverify ao lançar aplicativos java
-
08-07-2019 - |
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?
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