1) new, getstatic, putstatic 또는 Invokestatic의 네 가지 바이트코드 명령어가 발생할 때 클래스가 초기화되지 않은 경우 해당 초기화가 먼저 트리거되어야 합니다. 이러한 네 가지 명령어를 생성하는 가장 일반적인 Java 코드 시나리오는 다음과 같습니다. new 키워드를 사용하여 객체를 인스턴스화하는 경우, 클래스의 정적 필드를 읽거나 설정하는 경우(final에 의해 수정되고 결과는 컴파일 타임에 상수 풀에 저장됨) ). 필드) 및 클래스의 정적 메서드를 호출할 때. 2) java.lang.reflect 패키지의 메소드를 사용하여 클래스에 대한 반사 호출을 수행할 때 클래스가 초기화되지 않은 경우 해당 초기화가 먼저 트리거되어야 합니다. 3) 클래스를 초기화할 때 상위 클래스가 초기화되지 않은 것으로 확인되면 먼저 상위 클래스의 초기화를 트리거해야 합니다. 4) 가상 머신이 시작되면 사용자는 실행할 메인 클래스(main() 메서드가 포함된 클래스)를 지정해야 하며, 가상 머신은 메인 클래스를 먼저 초기화합니다. 5) JDK 1.7의 동적 언어 지원을 사용할 때, java.lang.invoke.MethodHandle 인스턴스의 최종 파싱 결과가 REF_getStatic, REF_putStatic, REF_invokeStatic의 메소드 핸들이고, 이 메소드 핸들에 해당하는 클래스가 초기화되지 않은 경우 먼저 초기화를 시작해야 합니다. 클래스 초기화를 트리거하는 다섯 가지 시나리오의 경우 가상 머신 사양은 "예만"이라는 매우 강력한 한정자를 사용합니다. 이 다섯 가지 시나리오의 동작을 클래스에 대한 활성 참조라고 합니다. 또한 클래스를 참조하는 모든 메서드는 초기화를 트리거하지 않으며 수동 참조라고 합니다.
아직 이 부분을 완전히 이해하지 못했기 때문에 감히 다른 사람을 오도할 수는 없습니다. 내가 아는 것처럼 가상 머신이 실행 중일 때 java.lang 패키지에 있는 클래스와 같이 일반적으로 사용되는 클래스를 미리 로드합니다. 프로그램에서 참조하는 클래스 파일/jar 패키지에는 로딩 프로세스가 있습니다. 가상 머신에 클래스 파일이 필요한 경우 기본 classLoader.loadClass()를 호출하여 로드합니다. 이 메서드는 먼저 로드된 클래스를 검색하고, 발견되지 않으면 반환합니다. 발견되면 상위 로더에 전달됩니다. 레이어별로 검색한 후 classLoader는 findClass 메서드를 호출하여 파일을 로드합니다. 보호 클래스<?> loadClass(문자열 이름, 부울 해석)
모두 로드되는 것은 아니며 요청 시 로드되는 것으로 이해될 수 있습니다.
예를 들어 상속된 상위 클래스, 구현된 인터페이스, 선언된 변수, 메서드의 반환 유형 등입니다.
즉, 현재 클래스를 사용할 때 누락된 필수 클래스가 즉시 로드됩니다.
요청 시 로드됩니다.
수업 로딩 시간:
1) new, getstatic, putstatic 또는 Invokestatic의 네 가지 바이트코드 명령어가 발생할 때 클래스가 초기화되지 않은 경우 해당 초기화가 먼저 트리거되어야 합니다. 이러한 네 가지 명령어를 생성하는 가장 일반적인 Java 코드 시나리오는 다음과 같습니다. new 키워드를 사용하여 객체를 인스턴스화하는 경우, 클래스의 정적 필드를 읽거나 설정하는 경우(final에 의해 수정되고 결과는 컴파일 타임에 상수 풀에 저장됨) ). 필드) 및 클래스의 정적 메서드를 호출할 때.
2) java.lang.reflect 패키지의 메소드를 사용하여 클래스에 대한 반사 호출을 수행할 때 클래스가 초기화되지 않은 경우 해당 초기화가 먼저 트리거되어야 합니다.
3) 클래스를 초기화할 때 상위 클래스가 초기화되지 않은 것으로 확인되면 먼저 상위 클래스의 초기화를 트리거해야 합니다.
4) 가상 머신이 시작되면 사용자는 실행할 메인 클래스(main() 메서드가 포함된 클래스)를 지정해야 하며, 가상 머신은 메인 클래스를 먼저 초기화합니다.
5) JDK 1.7의 동적 언어 지원을 사용할 때, java.lang.invoke.MethodHandle 인스턴스의 최종 파싱 결과가 REF_getStatic, REF_putStatic, REF_invokeStatic의 메소드 핸들이고, 이 메소드 핸들에 해당하는 클래스가 초기화되지 않은 경우 먼저 초기화를 시작해야 합니다.
클래스 초기화를 트리거하는 다섯 가지 시나리오의 경우 가상 머신 사양은 "예만"이라는 매우 강력한 한정자를 사용합니다. 이 다섯 가지 시나리오의 동작을 클래스에 대한 활성 참조라고 합니다. 또한 클래스를 참조하는 모든 메서드는 초기화를 트리거하지 않으며 수동 참조라고 합니다.
출처: JVM 7.2 클래스 로딩 타이밍에 대한 심층적 이해
아직 이 부분을 완전히 이해하지 못했기 때문에 감히 다른 사람을 오도할 수는 없습니다.
으아아아내가 아는 것처럼 가상 머신이 실행 중일 때 java.lang 패키지에 있는 클래스와 같이 일반적으로 사용되는 클래스를 미리 로드합니다.
프로그램에서 참조하는 클래스 파일/jar 패키지에는 로딩 프로세스가 있습니다.
가상 머신에 클래스 파일이 필요한 경우 기본 classLoader.loadClass()를 호출하여 로드합니다. 이 메서드는 먼저 로드된 클래스를 검색하고, 발견되지 않으면 반환합니다. 발견되면 상위 로더에 전달됩니다. 레이어별로 검색한 후 classLoader는 findClass 메서드를 호출하여 파일을 로드합니다.
보호 클래스<?> loadClass(문자열 이름, 부울 해석)
http://blog.csdn.net/briblue/...
이 블로그를 참고하시면 아주 좋습니다