JVM 의 세대 구분 모델 을 자세히 설명 하 다.
지난 글 에서 우 리 는 함께 jvm 의 메모리 모델 에 대해 비교적 명확 한 인식 을 가지 게 되 었 다.젊은이 들 은 참고 할 수 있다JVM 메모리 모델 은 더 이상 비밀 이 아 닙 니 다.이 글 을 복습 할 수 있다.
이 글 은 jvm 메모리 의 세대 구분 모델 에 대해 상세 한 분석 을 하여 여러분 과 함께 jvm 의 세대 구분 모델 을 쉽게 이해 할 것 입 니 다.
다른 글 을 본 젊은이 들 은 jvm 의 세대 구분 모델 은 젊 은 세대,늙 은 시대,영구 대 를 포함한다 고 믿 을 것 이다.
그렇다면 이들 은 각각 어떤 역할 을 대표 하고 있 을 까?코드 부터 볼 게 요.
public class Main {
public static void main(String[] args) {
while (true){
load();
}
}
public static void load(){
SysUser sysUser = new SysUser();
sysUser.setAvatar("1");
}
}
이 코드 자 체 는 특별한 의미 가 없고 주로 jvm 의 운영 체 제 를 이해 합 니 다.먼저 main()방법 을 실행 하면 main()방법의 스 택 프레임 을 main 스 레 드 의 가상 스 택 에 누 른 다음 load()방법 을 호출 한 후 load()방법의 스 택 프레임 을 가상 스 택 에 누 릅 니 다.
이 어 load()방법 을 실행 할 때 자바 메모리 에 SysUser 대상 인 스 턴 스 를 만 들 고 스 택 프레임 에는 sysUser 부분 변수 가 메모리 에 있 는 SysUser 대상 인 스 턴 스 를 참조 합 니 다.
다음 그림:
여기까지 와 서 위의 문장 을 모두 설명 한 적 이 있 으 니 모두 가 이해 할 수 있 을 것 이 라 고 믿는다.
변수의 생존 시간
지금 생각해 보면 이 SysUser 대상 은 실제 적 으로 짧 은 생존 대상 에 속 합 니 다.load()방법 이 실 행 된 후에 load()방법의 스 택 프레임 이 스 택 에서 나 오기 때 문 입 니 다.
스 택 이 나 오 면 SysUser 라 는 부분 변 수 는 SysUser 라 는 대상 의 인 스 턴 스 를 참조 하지 않 습 니 다.
그래서 사실 이 SysUser 대상 은 이미 사용 되 지 않 았 지만 메모리 의 공간 을 차지 하고 있 습 니 다.그러면 인용 되 지 않 은 대상 인 스 턴 스 jvm 은 어떻게 처리 합 니까?
이것 은 jvm 의 쓰레기 회수 메커니즘 을 말 해 야 한다.jvm 자체 에 쓰레기 회수 메커니즘 이 있 는데 이것 은 백 엔 드 라인 으로 아무 도 인용 하지 않 은 SysUser 대상 의 실례 를 회수 하고 메모리 공간 을 끊임없이 방출 한다.
그래서 이 SysUser 대상 인 스 턴 스 는 생존 시간 이 매우 짧 은 대상 으로 load()방법 을 실행 할 때 만들어 지고 실행 한 후에 쓰레기 에 의 해 회수 되 었 을 수 있 습 니 다.
이런 대상 은 우리 가 평소에 개발 하 는 과정 에서 흔히 볼 수 있 는 것 으로 절대 다수의 비율 을 차지한다.
지금 우 리 는 위의 코드 를 개조 할 것 이다.
public class Main {
private static SysUser sysUser = new SysUser();
public static void main(String[] args) {
while (true){
load();
}
}
public static void load(){
sysUser.setAvatar("1");
}
}
사실은 부분 변수 인 sysUser 를 정적 변수 로 바 꾸 었 습 니 다.이렇게 수정 한 후에 sysUser 는 부분 변수 로 스 택 에 저장 하지 않 고 class 류 파일 과 함께 방법 구역 에 저장 합 니 다.그러면 SysUser 대상 인 스 턴 스 는 이 정적 변수 에 계속 인용 되 기 때문에 쓰레기 로 회수 되 지 않 고 메모리 에 계속 저 장 됩 니 다.다음 그림:세대 별 모델
다음은 우리 가 핵심 내용 으로 들 어 가 는 것 이 바로 jvm 의 세대 구분 모델 이다.
앞에서 우 리 는 우리 의 인 코딩 방식 에 따라 서로 다른 방식 으로 대상 을 만 들 고 사용 하 며 대상 의 생존 시간 이 다르다 는 것 을 발견 했다.
그래서 jvm 은 메모 리 를 두 개의 구역 으로 나 누 었 다.젊 은 세대 와 오래된 시대 이다.
젊 은 세 대 는 우리 의 첫 번 째 부분 변수의 예 로 생 성 과 사용 이 끝나 면 쓰레기 로 회수 된다.
오래된 시 대 는 두 번 째 정적 변수의 예 로 생 성 된 후에 장기 적 으로 메모리 에서 살아 남아 야 한다.
여기까지 믿 으 면 어떤 대상 이 단기 생존 의 대상 이 고 어떤 대상 이 장기 생존 의 대상 인지 이해 해 야 한다.그렇다면 이들 은 어떻게 젊 은 세대 와 늙 은 시대 에 각각 존재 하 는 것 일 까?왜 이렇게 구분 해요?
사실 이것 은 쓰레기 회수 메커니즘 과 밀접 한 관 계 를 가진다.
젊 은 세대 의 대상 에 대해 서 는 생 성 후 곧 회수 되 는 것 이 특징 이 고,오래된 시대 의 대상 에 대해 서 는 장기 적 으로 생존 해 야 한 다 는 특징 이 있 기 때문에 이 두 가지 대상 은 쓰레기 회수 알고리즘 으로 회수 할 수 없 기 때문에 두 가지 로 구분 해 야 한다.
장기 적 으로 존재 하 는 정적 변수 인 sysUser 에 대해 사실은 처음에 도 젊 은 세대 에 있 었 습 니 다.그러면 언제 옛날 에 들 어 갔 습 니까?우 리 는 다음 글 에서 이 문 제 를 설명 할 것 이다.
그 영구 대 는 또 무엇 일 까?사실은 영구 대 는 우리 가 말 한 jvm 의 방법 구역 으로 이런 정 보 를 저장 하 는 데 사용 된다.이 부분 이후 의 글 은 상세 하 게 설명 할 수 있 으 니 이 제 는 이 를 이해 하면 된다.
신세대 쓰레기 회수
앞에서 알 았 듯 이 load 방법 이 스 택 에서 실 행 된 후에 안의 부분 변수 인 sysUser 가 없어 지고 메모리 에 있 는 SysUser 대상 이 인용 되 지 않 아서 쓰레기 로 회수 된다.
그렇다면 문 제 는 인용 되 지 않 으 면 바로 쓰레기 회수 가 발생 하고 인용 되 지 않 은 대상 인 스 턴 스 를 회수 하 는 것 일 까?
사실은 그렇지 않 습 니 다.쓰레기 수 거 는 촉발 조건 이 있 습 니 다.
비교적 흔히 볼 수 있 는 장면 이 있 습 니 다.만약 에 우리 의 코드 에 대량의 대상 을 만 들 었 다 고 가정 하면 메모리 에 대량의 대상 을 사재 기 했 습 니 다.그리고 이 대상 들 은 현재 아무 도 인용 하지 않 았 습 니 다.
이때 신세대 가 미리 배정 한 메모리 공간 이 가득 차 면 우리 의 코드 는 이때 대상 을 새로 만 들 려 고 할 때 신세대 공간 이 꽉 찬 것 을 발견 하면 어떻게 합 니까?
이 럴 때 는'마 이 너 GC'또는'영 GC'라 고도 하 는 신세대 쓰레기 수 거 를 촉발 하 는데,신세대 중 아무 도 인용 하지 않 은 대상 을 수 거 해 공간 을 방출 하려 고 시도 한다.
다음 그림 은 이 과정 을 표현 했다.
장기 생존 의 대상 은 언제 노년기 에 접어 들 었 습 니까?
다음 에 우 리 는 정적 변수 가 인용 한 장기 생존 대상 이 언제 옛날 에 들 어 갔 는 지 에 대해 이야기 합 니 다.
앞에서 알 수 있 듯 이 신세대 대상 은 쓰레기 수 거 를 한 번 겪 고 정적 변수 에 의 해 인 용 된 대상 은 계속 인용 되 기 때문에 회수 되 지 않 기 때문에 이때 jvm 에 규정 이 있다.
신세대 의 대상 이 쓰레기 수 거 를 15 번 겪 고도 꿋꿋 하 게 살아 남 았 다 면'노인'임 을 증명 하고 옛날 로 옮 겨 갈 것 이다.
옛날 에는 이런 연령 대의 대상 을 맡 겼 다.
그렇다면 옛날 대상 은 쓰레기 로 회수 되 는 것 일 까?
답 은 긍정 적 이다.옛날 에 대상 이 코드 가 실 행 됨 에 따라 아무 에 게 도 인용 되 지 않 고 쓰레기 를 회수 해 야 했 기 때문이다.
혹은 점점 더 많은 대상 이 옛날 로 접어 들 면서 옛날 메모리 도 가득 차 있 기 때문에 반드시 옛날 에 쓰레기 를 회수 해 야 한다.
우 리 는 잠시 구체 적 으로 어떻게 회수 하 는 지 를 고려 할 필요 가 없다.이 내용 은 이후 의 글 에서 우 리 는 상세 하 게 해석 할 것 이다.
총결산
오늘 이렇게 많은 내용 을 준 비 했 습 니 다.아직 충분히 보지 못 했다 고 생각 하 는 친구 들 이 있 을 수도 있 습 니 다.이런 내용 들 은 모두 간단 합 니 다.저 는 이미 알 고 있 습 니 다.더 깊이 있 는 것 이 있 습 니까?
서 두 르 지 마 세 요.공 부 는 순서에 따라 점진 적 인 일 입 니 다.왕 자 는 가장 간단 한 대화 로 아이들 과 함께 jvm 의 원 리 를 토론 하고 싶 습 니 다.그리고 사례 를 찾 아 여러분 과 함께 토론 하고 싶 습 니 다.인상 이 더욱 깊 을 것 입 니 다.
그래서 오늘 은 친구 들 이 여기까지 만 알 면 됩 니 다.우 리 는 후속 적 인 글 에서 흩 어 지지 않 고 더 깊 은 내용 을 깊이 토론 합 시다.
이상 은 JVM 의 세대 구분 모델 에 대한 상세 한 내용 입 니 다.JVM 세대 구분 모델 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.