공부 첫날
c 와 c++와 달리 자바 의 가상 컴퓨터 는 자동 쓰레기 회수 체 제 를 가지 고 있어 프로그래머 들 이 쓰레기 회수 의 구체 적 인 과정 에 관심 을 가 질 필요 가 없다.그러나 그 렇 기 때문에 자바 메모리 가 유출 되 거나 메모리 가 넘 칠 때 조사 작업 이 번 거 로 워 지기 때문에 jvm 을 이해 하 는 것 은 의미 가 있다.
1.jvm 이 실 행 될 때 데이터 구역:방법 구역,스 택(로 컬 방법 스 택,가상 컴퓨터 스 택),프로그램 카운터,더미 로 나 뉜 다.
프로그램 카운터:cpu 가 스 레 드 를 처리 할 때 폴 링 방식 을 사용 하기 때문에 계수 기 는 cpu 가 다음 스 레 드 의 스케줄 링 을 완성 하 는 데 도움 을 줄 것 입 니 다.물론 모든 스 레 드 는 cpu 가 해당 하 는 스 레 드 를 찾 을 수 있 도록 독립 된 프로그램 카운터 가 있 습 니 다.
스 택:jvm 의 스 택 은 가상 컴퓨터 스 택 과 로 컬 방법 스 택 으로 나 뉘 는데 프로그램 이 실행 되 는 과정 에서 많은 부분 변수 가 발생 할 수 있 습 니 다.즉,많은 기본 유형 과 대상 의 참조 입 니 다.스 택 의 인용 깊이 가 가상 컴퓨터 가 허용 하 는 깊이 를 초과 하면 StackOverflow Error 를 던 지고 가상 컴퓨터 의 확장 메모리 가 미리 정 해진 메모 리 를 초과 할 때 OutOf Memory Error 를 던 집 니 다.
더미:모든 스 레 드 가 공유 하 는 메모리 영역 입 니 다.대상 의 인 스 턴 스 를 저장 합 니 다.마찬가지 로 확장 메모리 가 경 계 를 넘 을 때 OutOfmory Error 를 던 집 니 다.
방법 구역:일반적으로 비 더미 라 고 부 릅 니 다.이 를 쌓 아 올 리 는 구역 과 분리 하기 위해 서 는 주로 운행 시 상수 탱크 를 포함 하고 정적 상수 들 을 저장 합 니 다.
대상 방문
두 가지 방식 으로 나 뉘 는데,문형 과 직접 지침 이다.
핸들 방식 에 서 는 핸들 풀 에 저 장 된 핸들 의 메모리 주 소 를 참조 한 다음 핸들 주소 에 따라 대상 인 스 턴 스 의 주 소 를 찾 습 니 다.대상 인 스 턴 스 의 주소 가 바 뀌 었 을 때 핸들 의 주 소 를 바 꾸 고 인 용 된 주 소 는 바 꾸 지 않 는 것 이 장점 입 니 다.
직접 포인터:대상 인 스 턴 스 의 메모리 주 소 를 저장 합 니 다.주소 지정 과정 을 줄 이 는 것 이 장점 입 니 다.
3.쓰레기 수집 기와 메모리 배분 전략
GC 는 주로 세 가지 일 을 완성 합 니 다.
1.그 메모리 들 은 회수 해 야 합 니 다.
2,언제 회수
3,어떻게 회수
우 리 는 프로그램 카운터 와 스 택 은 스 레 드 의 생명 주 기 를 바짝 따 르 는 것 을 알 고 있 습 니 다.스 레 드 의 생명 주기 에 스 택 의 스 택 프레임 도 질서 있 게 스 택 에서 나 오고 스 택 에 들 어가 기 때문에 이 부분의 쓰레기 수 거 는 자 연 스 럽 고 질서 가 있 습 니 다.기본적으로 클래스 가 확 정 된 후에 이 부분의 메모리 회수 와 분 배 는 모두 확정 되 었 습 니 다.그러나 더 미 는 정반 대로 일련의 불확실 성 을 가지 고 있 고 GC 가 주목 하 는 것 도 이 부분의 메모리 분배 와 회수 이다.
jdk 1.2 이후 자바 는 인용 을 네 가지 로 나 눌 것 이다.강 한 인용,부 드 러 운 인용,만약 인용,허 인용 네 가지 로 나 눌 것 이다.
강 인용 이란 프로그램 에 보편적으로 존재 하 는 Object obj=new Object()와 유사 한 것 을 말 합 니 다.강 인용 만 존재 한다 면 대상 은 영원히 회수 되 지 않 습 니 다.
대상 인 스 턴 스 를 GC 에서 회수 하려 면 두 단 계 를 거 쳐 야 합 니 다.루트 경로 가 도달 할 수 없다 고 판단 한 후에 첫 번 째 로 표시 되 고 선별 할 것 입 니 다.선택 한 조건 은 이 대상 이 finalize 방법 을 실행 할 필요 가 있 는 지 여부 입 니 다.대상 이 finalize 방법 을 복사 하지 않 았 거나 변경 방법 이 가상 컴퓨터 에 호출 되 었 다 면 실행 할 필요 가 없다 고 판단 합 니 다.실행 이 필요 하 다 면 대상 은 F-Queue 의 대기 열 에 들 어가 고 finalize 방법 은 대상 이 회수 에서 벗 어 날 수 있 는 마지막 기회 입 니 다.
package com.struts.jvm;
public class FinalizeEscapeGC {
public static FinalizeEscapeGC SAVE_HOOK = null;
//
public void isAlive(){
System.out.println("yes,i am still alive");
}
//
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize method executed");
FinalizeEscapeGC.SAVE_HOOK = this;
}
public static void main(String[] args) throws Exception {
SAVE_HOOK = new FinalizeEscapeGC();
// , ,
SAVE_HOOK = null;
gc();
// , finalize ,
SAVE_HOOK = null;
gc();
}
private static void gc() throws InterruptedException {
System.gc();
Thread.sleep(500);
if(SAVE_HOOK != null){
SAVE_HOOK.isAlive();
}else{
System.out.println("no,i am dead:");
}
}
}
// :
finalize method executed
yes,i am still alive
no,i am dead
이 를 통 해 알 수 있 듯 이 대상 의 finalize 방법 은 한 번 만 호출 될 수 있 습 니 다.다음 회수 에 직면 하면 다시 호출 되 지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.