programing tip

간단한 프로그램을위한 클래스 로딩의 흐름

itbloger 2020. 11. 24. 07:45
반응형

간단한 프로그램을위한 클래스 로딩의 흐름


저는 이제 막 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.) 해결 : 심볼릭 참조는 클래스 수준 데이터와 정적 변수를 포함하는 "메소드 영역"의 원래 참조로 대체됩니다.

JVM 아치

참고 URL : https://stackoverflow.com/questions/20796046/flow-of-class-loading-for-a-simple-program

반응형