당신은 3GB의 jar 파일을 가지고 있고 애플리케이션은 그 안에 작은 클래스만을 사용합니다. JVM이 전체 jar 파일을 메모리에로드하거나 목차를 읽고 필요한 조각 만로드합니까? 이 동작을 제어 할 수 있습니까?Java JVM은 하나의 클래스 만 사용하는 경우 전체 jar 또는 ear를로드합니까?
답변
JVM은 호출 될 때 Jar에서 필수 클래스 만로드합니다. 응용 프로그램에 클래스가 필요한 경우 클래스 및 기타 모든 종속 클래스가로드됩니다. 잘 모르겠지만 클래스 로더에서 클래스를 찾고로드하는 것은 클래스 로더의 책임이라고 생각합니다.
기본 클래스 로더는 필요할 때 필요한 항목 만로드합니다. CLASSPATH에 10MB JAR이 있고 하나의 .class 파일 만 필요한 경우 JVM은 코드가 처음 액세스 할 때 해당 클래스를로드합니다. .class 바이트 코드는 perm 공간으로 들어갑니다.
자신 만의 클래스 로더를 작성할 수 있다는 의미에서 "제어 가능"하지만 약간의 전문 지식이 필요합니다.
전적으로 JVM 및 클래스 로더에 따라 다릅니다. JVM 스펙은 클래스를 지정합니다. 이 처음으로 활성 상태로 사용됩니다. 클래스 로더는 예상보다 빨리 클래스의 일부를로드 할 수 있습니다. 실제로 대부분의 클래스 로더는 가능한 길게 로딩을 지연시킵니다.
jar 파일은 zip 파일 형식입니다.
처리 방법은 JRE에 크게 좌우됩니다.
이전 버전의 메모리로 사용 된 Sun JRE는 전체 파일을 매핑합니다. 이렇게하면 논리 메모리가 할당되지만 디스크에서 데이터를로드 할 필요는 없습니다. (32 비트 Windows는 일반적으로 3GB의 연속 메모리를 할당 할 수 없지만 다른 OS에서는 가능합니다).
나는 현재의 행동이 메모리 맵에 Windows의 파일 뒷면에 중앙 디렉토리라고 믿습니다. 다른 OS에서는 읽기만합니다. 이것은 소스에서 #define
에 의해 제어됩니다.
JDK7은 다른 작업을 수행 할 가능성이 큽니다.
일반적으로 클래스는 느슨하게로드됩니다. 리소스는 매번 다시 읽습니다. java.util.ResourceBundle
캐시.