JVM 류 로드 메커니즘 (PS: 열 복구 로 인 한 화)
우선 클래스 로 딩 과정 을 알 아야 합 니 다: 로 딩 - 연결 (검증, 준비, 해석) - 초기 화
그 다음 에 모든 단계 에서 무엇 을 불 러 오 는 단계 에서 세 가지 일 을 완성 하 는 지 알 아야 한다 (3 단계)
로 딩 과정 과 연결 과정 은 동시에 진행 할 수 있 습 니 다 (비동기). 연결 과정 이 시작 되면 이 때 로 딩 이 끝 났 든 안 끝 났 든 연결 단계 라 고 할 수 있 습 니 다. 이 두 단계 의 시작 시간 은 고정된 선후 순 서 를 유지 하고 있 습 니 다.
연결 단계 – 검증 (세 부분) 1 파일 형식, 파일 형식 이 class 파일 형식 요구 2 메타 데이터 에 부합 되 는 지 확인 하고 바이트 코드 가 설명 한 정 보 를 의미 분석 3 바이트 코드 를 합 니 다. 데이터 흐름 과 제어 흐름 에 따라 프로그램의 의미 가 합 법 적 인지, 논리 에 부합 되 는 4 기호 참조 여 부 를 판단 하여 분석 동작 이 검증 단 계 를 정확하게 수행 할 수 있 도록 합 니 다. 필요 한 것 이 아 닙 니 다.프로그램 에 영향 을 주지 않 습 니 다. 반복 적 인 검증 이 필요 하 다 면 - Xverifynone 매개 변 수 를 사용 하여 대부분의 클래스 검증 조 치 를 닫 아 가상 컴퓨터 류 로 딩 시간 을 단축 시 키 는 것 을 고려 할 수 있 습 니 다.
연결 단계 – 이 단 계 를 준비 하 는 것 은 메모리 분배 단계 입 니 다. 정적 변 수 를 분배 하 는 것 입 니 다. 그러나 인 스 턴 스 변 수 는 이 럴 때 메모 리 를 분배 하지 않 습 니 다. 인 스 턴 스 변 수 는 초기 화 할 때 작 동 하 는 Eg:
public static int eg=666;
이 단계 에서 eg 의 값 은 666 이 아니 라 0 입 니 다. 이 때 어떠한 자바 방법 도 실행 하지 않 았 기 때 문 입 니 다.따라서 이 때 eg 의 값 은 0 이 고 666 은 정적 변수 에 값 을 부여 할 때 putstatic 작업 을 수행 해 야 값 을 부여 합 니 다. 이 동작 은 초기 화 단계 에 나타 나 야 합 니 다. 메모리 공간 을 개척 하 는 것 은 할당 이 아 닙 니 다.그러나 final 에 의 해 수식 되 고 준비 단계 에서 지정 한 값 으로 초기 화 되 는 특수 한 상황 이 있 습 니 다. 이 럴 때 eg 의 값 은 0 이 아 닌 666 으로 초기 화 됩 니 다.연결 단계 - 해석 해석 단 계 는 가상 컴퓨터 가 상수 탱크 안의 기호 인용 을 직접 인용 으로 바 꾸 는 과정 입 니 다.해석 동작 은 주로 클래스 나 인터페이스, 필드, 클래스 방법, 인터페이스 방법, 방법 유형, 방법 핸들 과 호출 점 한정 부 7 가지 기호 참조 에 대해 진행 된다.
초기 화 단계 이전의 메모리 개발, 초기 할당, 사실은 모두 컴퓨터 의 주관적 인 억측 입 니 다. 사실 입 니 다. 이 단 계 는 우리 의 뜻 에 따라 우리 의 코드 에 따라 실제 적 으로 변수 나 다른 자원 을 초기 화 하 는 것 입 니 다. 중간 에 중요 하지 않 은 요 소 는 바로 구조 기 () 입 니 다.사실 초기 화 단 계 는 클래스 구조 기 를 실행 하 는 과정 입 니 다. () 방법 은 컴 파일 러 가 클래스 의 모든 변 수 를 자동 으로 수집 하 는 할당 동작 과 정적 구문 블록 static {} 의 문 구 를 합 쳐 만 든 것 입 니 다. 컴 파일 러 가 수집 하 는 순 서 는 구문 이 원본 파일 에 나타 나 는 순서 에 의 해 결 정 됩 니 다.정적 구문 블록 은 정적 구문 블록 이전에 정 의 된 변수 에 만 접근 할 수 있 고 그 후의 변 수 를 정의 할 수 있 습 니 다. 앞의 정적 구문 블록 은 값 을 부여 할 수 있 지만 접근 할 수 없습니다.
public class StaticTest
{
public static void main(String[] args)
{
staticFunction();
}
static StaticTest st = new StaticTest();
static
{
System.out.println("1");
}
{
System.out.println("2");
}
StaticTest()
{
System.out.println("3");
System.out.println("a="+a+",b="+b);
}
public static void staticFunction(){
System.out.println("4");
}
int a=110;
static int b =112;
}
출력 결 과 는: 23 a = 110, b = 0 14 이 결 과 를 보고 어리둥절 한 표정 을 지 었 습 니 다. 23 무슨 귀신 입 니까?123 아니 야?그러면 우 리 는 뒤에서 보면 여기 가 바로 인 스 턴 스 변수 와 클래스 변수의 차이 점 입 니 다. 클래스 변 수 는 클래스 가 불 러 오 는 과정 에서 열 린 메모리 공간 으로 사용 할 수 있 습 니 다. 인 스 턴 스 변 수 는 클래스 의 인 스 턴 스 를 만 든 후에 야 메모리 공간 을 얻 을 수 있 습 니 다. 이때 우 리 는 그들 에 게 접근 할 수 있 습 니 다. 그러면 이해 하기 어렵 지 않 습 니 다.위 에서 아래 를 보면 클래스 가 실례 화 되 었 을 때 부터 정상 적 인 상황 에서 정적 코드 블록 은 일반적인 코드 블록 보다 우선 순위 가 높 았 다. 그러나 결 과 를 보면 일반 코드 블록 이 먼저 실행 되 었 다. 바로 그 문장 이 실례 화 된 귀신 이다. 클래스 가 실례 화 된 후에 여기 서 알 아야 할 것 은 static 에 의 해 수 식 된 분류 이다.그리고 수식 되 지 않 은 코드 블록 부분 은 대상 에 속 하고 가장 바깥쪽 에 속 하기 때문에 new 를 예화 한 후에 자신의 내용 을 수행 하기 때문에 23 의 순서 가 나 왔 습 니 다. 1. 왜 4 전에 더 말 할 필요 가 없 었 는 지 그 때 는 고민 이 2 가 1 보다 우선 하 다 는 것 을 이해 하지 못 했 습 니 다. 나중에 한 형 에 게 물 어 본 후에 이곳 의 대상 과 이런 구 덩이 를 알 게 되 었 습 니 다.이전에 이렇게 쓴 적 이 없 었 습 니 다. 병렬 평 급 관계 라 고 잘못 생각 했 기 때문에 자바 에서 할당 한 우선 순 위 를 끌 어 낼 수 있 습 니 다.
자바 의 할당 순서:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.