2012-06-06 2 views
2

클래스는 언제 JVM에로드됩니까? 서버 시작시 또는 클래스에 대한 참조가있을 때로드됩니까? 내 가정은 jboss와 같은 서버가 시작될 때 모든 클래스가로드되지만 lazyloading이라는 것이 있다는 것입니다.클래스로드 중 JVM

로드하는 것이 실제로 의미하는 것은 무엇입니까? 모든 메소드, 인스턴스 변수, 정적 변수 메소드를 비롯한 변수와 함께 JVM 메모리에 .class가 있다는 것을 의미합니까? 실행이 가능합니다. 나는 ClassLoader가로드 될 필요가있는 Java 클래스의 바이트 코드를 찾고, 바이트 코드를 읽고, particualr 클래스에 사용 된 다른 클래스의 refrencces를 검사하고, java.lang.Class 클래스의 인스턴스를 생성하여이를로드한다. 이것은 클래스를 실행을 위해 JVM에서 사용할 수있게합니다.

메소드도 클래스와 함께 JVM에로드됩니까? 내 가정은 메서드가 스레드의 스택 메모리에만 있다는 것입니다. 그러면 메쏘드 기억이란 무엇입니까? 그것은 힙 또는 스택의 일부입니까?

정적 메서드 만 인스턴스 메서드가 아닌 클래스 로딩과 함께로드됩니까? static boock 클래스가 실행될 때 실행되고 모든 정적 변수가 초기화된다는 것을 알았습니다.

이러한 의심이 사라지면 미리 감사드립니다.

답변

2

이들은 JVM에 대한 기본적인 질문으로 Google은 확실하게 답을 도울 수 있습니다. 단지 기본 (및 신뢰) 클래스는, 처음에, 짧은에 http://www.securingjava.com/chapter-two/chapter-two-7.html

: 질문 중 일부에 대한

(특히 실제로드 프로세스에 대한 질문) 당신은 예를 들어, 여기에 볼 수 있었다 JVM에 의해로드됩니다. 그런 다음 다른 클래스 로더 (예 : 부트 스트랩 클래스 로더)가 필요에 따라 만들어지며 더 많은 클래스가로드됩니다. 클래스를 성공적으로로드하려면 클래스가 의존하는 모든 클래스를로드해야합니다.

로드 된 클래스는 다양한 형태로 메모리에 저장되지만 (JVM에만 해당), Class 객체는 항상 노출됩니다. 클래스 내부의 모든 것 (메소드, 변수 등)이로드됩니다. 이것은 클래스가 또한 컴파일된다는 것을 의미하지 않는다. (컴파일은 나중에 메소드가 실행되어야 할 때 발생한다.)

메소드 변수의 할당은 스택 (프리미티브의 경우) 또는 힙 (heap)에서 발생합니다.

정적 변수의 초기화와 정적 블록의 실행은 클래스가로드 된 직후에 인스턴스가 생성되기 전에 발생합니다.