공부 첫날

더 읽 기
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 방법 은 한 번 만 호출 될 수 있 습 니 다.다음 회수 에 직면 하면 다시 호출 되 지 않 습 니 다.

좋은 웹페이지 즐겨찾기