문제

나는 악기 수업을 들고 가져가는 많은 앱을 보았습니다. -javaagent 로드시 매개 변수로도 a -noverify 명령 줄에.

Java Doc은 그렇게 말합니다 -noverify 클래스 검증을 끕니다.

그러나 왜 인스 커뮤니케이션 클래스 인 경우에도 검증을 끄고 싶어하는 이유는 무엇입니까?

도움이 되었습니까?

해결책

스타트 업 시간, 말하고 싶습니다. 클래스가 올바른지 확인하는 데 클래스가로드 될 때 시간이 걸립니다. 클래스는 게으른 방식으로로드 될 수 있으므로 (앱 시작이 아니라 처음으로 사용될 때) 예상치 못한 런타임 지연이 발생할 수 있습니다.

실제로 수업은 일반적으로 확인할 필요가 없습니다. 컴파일러는 유효하지 않은 바이트 코드 또는 클래스 구성을 방출하지 않습니다. 검증의 이유는 클래스가 하나의 시스템을 구축하고 온라인으로 호스팅되며 보호되지 않은 인터넷을 통해 귀하에게 전송되기 때문입니다. 이 경로에서 악의적 인 공격자는 바이트 코드를 수정하고 컴파일러가 결코 생성하지 못한 것을 만들 수 있습니다. JVM을 충돌 시키거나 보안 제한을 우회 할 수있는 것. 따라서 클래스는 사용하기 전에 확인됩니다. 이것이 로컬 응용 프로그램 인 경우 일반적으로 바이트 코드를 다시 확인할 필요가 없습니다.

다른 팁

그것이 함께 사용될 때 -javaagent, 아마도 가능성이 높습니다 ~ 아니다 성능의 이유로, 그러나 에이전트가 의도적으로 "유효하지 않은"바이트 코드를 생성하기 때문입니다.

일부 검증 규칙 중 일부가 매우 엄격하기 때문에 유효하지 않은 바이트 코드는 여전히 정상으로 실행될 수 있습니다. 예를 들어, this 이 시점에서 변수가 초기화되지 않기 때문에 슈퍼 구성자가 호출되기 전에 생성자에 액세스해서는 안됩니다. 그러나 여전히 당신이하고 싶은 다른 일이있을 수 있습니다 (Jrebel 예 참조). 그런 다음 사용합니다 -noverify 그 규칙을 우회합니다.

디버깅! 사실 그것이 제가 지금하고있는 일 이며이 질문을 우연히 발견했습니다. Terracotta에서 우리는 많은 바이트 코드 계측을 수행하며 때로는 클래스 어댑터를 디버깅 할 때 검증자를 끄는 데 도움이되므로 런타임에서 정확히 실패하는 위치를 확인할 수 있습니다.

당신은 맞습니다. 우리는 검증자가 생산에 남아 있기를 원합니다.

jrebel을 사용하지 않고 사용합니다 -noverify 스타트 업 에서이 경고를 제공합니다.

JREBEL : '-Noverify'누락, 변경/추가/제거/제거 기능이 활성화되지 않습니다!

그래서 보입니다 -noverify 바이트 코드 재 계약이 불가능한 일을하도록 허용합니다.

시작 시간은 약간의 문제였습니다. 그러나 프로세서와 마찬가지로 검증자는 이제 더 빠릅니다. JDK6 JAVAC으로 컴파일 된 코드는 기본적으로 검증기를 더 빨리 단계적으로 만들기위한 추가 정보가 포함되어 있습니다. Apache Harmony는 훨씬 빠른 검증 알고리즘을 사용합니다.

매우 오래된 버전의 Javac은 잘못된 바이트 코드를 생성했습니다. 실제로 Sun 플러그인에는 여전히 깨진 클래스 파일을 확인하기위한 수정 코드가 포함되어 있습니다.

Java 6에 도입 된 새로운 검증자는 코드 조작 프로세스에 매우 복잡합니다.

이것을 살펴보십시오 :http://chrononsystems.com/blog/java-7-lesign-flaw-leads-to-huge-bookward-for-the-jvm

관련 버그 보고서 :http://bugs.sun.com/view_bug.do?bug_id=8009595

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top