간단한 프로그램을위한 클래스 로딩의 흐름
저는 이제 막 Java의 내부 아키텍처를 배우기 시작했습니다. jvm
실행할 때 필요한 클래스를로드하고 ClassNotFoundException
클래스를 찾을 수없고 특정 클래스 로더가 클래스가 참조하는 클래스를로드 할 때 발생 하는 클래스 로딩의 개념을 대략 이해했습니다 .
누군가가 클래스 로딩의 흐름, 즉 부트 스트랩 클래스 로딩의 순서와 아래의 샘플 자바 코드에서 사용자 정의 클래스 로딩을 명확하게 설명해 주시겠습니까?
import java.io.File;
public class Sample
{
public static void main(String[] args)
{
String fileName = "sample";
File file = new File(fileName);
file.isFile();
}
}
또한 " classloader
로드하는 클래스의 네임 스페이스를 유지 "하는 참조 자료에서 배웠습니다 . 네임 스페이스는 클래스의 리터럴 이름을 의미합니까? 또한 누군가가 그 의미 / 장점을 설명해 주시겠습니까?
Sample
다음과 같이 수업을 실행합니다.
> java Sample
약간의 마술을 위해 -verbose:class
옵션 의 출력을 확인하면 다음과 같은 많은 줄을 볼 수 있습니다 ..
[Opened C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded java.lang.Object from C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded java.io.Serializable from C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded java.lang.Comparable from C:\jdk1.6.0_14\jre\lib\rt.jar]
.
.
.
.
.
.
[Loaded java.security.cert.Certificate from C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded Sample from file:/D:/tmp/]
[Loaded java.lang.Shutdown from C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\jdk1.6.0_14\jre\lib\rt.jar]
클래스 로더 (또는 Primordial) \jre\lib\rt.jar
가 클래스를로드하기 훨씬 전에 여러 클래스가로드되는 것을 볼 수 있습니다 Bootstrap
. 이는 부트 스트랩에 의해로드 된 모든 Java 프로그램을 실행하기위한 전제 조건입니다.
다른 jar 세트는 Extension
클래스 로더에 의해로드됩니다 . 이 특정 예제에서는 lib의 클래스가 필요 \jre\lib\ext
하지 않았으므로로드되지 않았습니다. 그러나 확장 클래스 로더에는 확장 lib에서 클래스를로드하는 작업이 특별히 할당됩니다.
편집 : 표준 플랫폼 자바 클래스 외에도 Sun / Oracle 은 플랫폼의 핵심 API 를 확장하는 데 사용되는 jar 세트도 제공합니다 . 확장 lib 폴더에있는 jar는 자동으로 클래스 경로에 배치되므로 클래스 경로에 명시 적으로 포함 할 필요가 없습니다. 다음은 같은 주제에 대한 멋진 공식 기사 입니다.
마지막으로 Bootstrap 및 Extension이로드를 완료 한 후 클래스 로더에 Sample
의해 클래스 가로드됩니다 Application
.
클래스 로더 계층
새 JVM이 시작될 때마다 부트 스트랩 클래스 로더는 키 Java 클래스 ( java.lang
패키지에서) 및 기타 런타임 클래스를 먼저 메모리 로로드합니다 . 부트 스트랩 클래스 로더는 다른 모든 클래스 로더의 상위입니다. 결과적으로 부모가없는 유일한 사람입니다.
다음은 확장 클래스 로더입니다. 부트 스트랩 클래스 로더를 부모로 가지며 경로에 .jar
보관 된 모든 파일 에서 클래스를로드 합니다. java.ext.dirs
이러한 파일 은 JVM의 클래스 경로에 관계없이 사용할 수 있습니다.
개발자의 관점 에서 세 번째이자 가장 중요한 클래스 로더 는 확장 클래스 로더의 직계 자식 인 시스템 클래스 경로 클래스 로더입니다. CLASSPATH
환경 변수, java.class.path
시스템 속성 또는 -classpath
명령 줄 옵션으로 지정된 디렉토리 및 jar 파일에서 클래스를로드합니다 .
ClassLoader 네임 스페이스
Java에서 클래스는 ClassLoader + Class
두 개의 다른 클래스 로더에 의해로드 될 수있는 동일한 클래스를 사용하여 고유하게 식별됩니다 .
Class A loaded by ClassLoader A != Class A loaded by ClassLoader B
어떻게 도움이 되나요?
It is helpful for defining different protection and access policies for different classloaders. Take an example of applet which is loaded using a different classloader, you would not want a third party application all access to your resources. So for security its important to maintain different namespaces.
JVM maintains a runtime pool in permgen area where classes are loaded. Whenever a class is referenced default class loader finds the class in the class path and loads it into this pool. And this is not specific to user defined classes or classes provided in JDK. When a class is referenced it is loaded into the memory.
Classes loaded by the ClassLoader are stored internally in the ClassLoader instance
// The classes loaded by this class loader. The only purpose of this table
// is to keep the classes from being GC'ed until the loader is GC'ed.
private final Vector<Class<?>> classes = new Vector<>();
When class needs to be added to the memory following function is called:
// Invoked by the VM to record every loaded class with this loader.
void addClass(Class c) {
classes.addElement(c);
}
Found a useful diagram on how Class Loaders work.
The Java Virtual Machine starts up by creating an initial class, which is specified in an implementation-dependent manner, using the bootstrap class loader (§5.3.1). The Java Virtual Machine then links the initial class, initializes it and the static instance variables declared in it and finally invokes the public class method void main(String[]). The invocation of this method drives all further execution. Execution of the Java Virtual Machine instructions constituting the main method may cause linking (and consequently creation) of additional classes and interfaces, as well as invocation of additional methods.
read this link
The loading process can be viewed as interaction between Classloader Subsystem and the Memory Area of JVM.
Classloader는 일반적인 세 단계로 작동합니다. 1.) 로딩 2.) 링크 및 3.) 초기화.
클래스 로더 서브 시스템과 메모리 영역 간의 매우 기본적인 상호 작용은 링크 중에 발생합니다 (다른 상호 작용과는 별개입니다!).
연결 활동은 i.) 검증 ii.) 준비 및 iii.) 해결로 세분됩니다. 확인 : 더 많은 보안을 위해 유효한 컴파일이 확인됩니다. 단계 ii.) 준비-정적 변수 메모리가 할당되고 기본값으로 할당됩니다. 그리고
iii.) 해결 : 심볼릭 참조는 클래스 수준 데이터와 정적 변수를 포함하는 "메소드 영역"의 원래 참조로 대체됩니다.
참고 URL : https://stackoverflow.com/questions/20796046/flow-of-class-loading-for-a-simple-program
'programing tip' 카테고리의 다른 글
Bitbucket에서 태그를 추가하는 방법은 무엇입니까? (0) | 2020.11.24 |
---|---|
노드 익스프레스 서버를 올바르게 닫는 방법은 무엇입니까? (0) | 2020.11.24 |
입력 유형 "숫자"는 크기가 조정되지 않습니다. (0) | 2020.11.24 |
Ansible을 사용한 SSH 에이전트 전달 (0) | 2020.11.24 |
값 검색 (0) | 2020.11.24 |