C\#실행 시 상호 관계 에 대한 분석

4376 단어 C#상호 관계
본 고 는 주로 운행 시 유형,대상,스 레 드 스 택 과 위탁 관리 더미 간 의 상호 관계,정적 방법,인 스 턴 스 방법 과 가상 방법의 차이,그리고 메모리 의 배분 과 회 수 를 말한다.
스 레 드 스 택:한 프로 세 스에 여러 개의 스 레 드 를 포함 할 수 있 습 니 다.한 스 레 드 가 생 성 될 때 크기 가 1MB 크기 의 스 택 에 분 배 됩 니 다.스 택 은 저장 방법 에 사용 되 는 실제 인삼,형태 인삼 과 방법 내부 의 부분 변 수 를 포함 할 수 있 습 니 다.스 택 은 높 은 메모리 주소 에서 위치 주소 로 구 축 됩 니 다.스 택 은 선진 적 인 특징 이 있 기 때문에 먼저 정 의 된 변 수 를 회수 합 니 다.
다음은 스 레 드 스 택 을 더 잘 알 수 있 도록 간단 한 예 를 보 겠 습 니 다.

스 레 드 스 택 은 높 은 위치 에서 메모 리 를 분배 하기 시 작 했 기 때문에 먼저 분 배 된 저 는 위 에 그 렸 습 니 다.F1()을 호출 하고 있 습 니 다.방법 시 메모리 할당 순 서 는 name->n->F2 의 반환 주소->Age->name 입 니 다.메모리 회수 순 서 는 당연히 반대 다.한 방법 에는 서막 코드 를 포함 하여 초기 화 작업 을 하고 마지막 코드 도 있어 야 하 며,실행 이 끝 난 후에 회수 작업 을 해 야 한다.방법의 반환 주소 가 먼저 분배 되 기 때문에 방법 이 실 행 될 때 반환 주소 로 돌아 가면 너무 깊 으 면 스 택 이 넘 치기 쉽 습 니 다.제 를 보 세 요.매개 변수,부분 변 수 는 방법 이 돌아 올 때 까지 기 다 려 야 회수 할 수 있 기 때 문 입 니 다.
위탁 관리 더 미 를 소개 하기 전에 두 가지 간단 한 종 류 를 먼저 보 세 요.

publicclassPerson 
{ 
privateintheight; 
publicvoidSetHeight(intheight) 
{ 
this.height = height; 
} 
publicvirtualvoidSay(stringword) { } 
publicstaticstringHead() 
{ 
return"my head"; 
} 
publicstaticintAge = 100; 
} 
publicclassStudent : Person 
{ 
publicoverridevoidSay(stringword) 
{ 
Console.WriteLine(word); 
} 
} 
 

staticvoidMain(string[] args) 
{ 
Person student = newStudent(); 
student.Say("Hello cth"); 
student.SetHeight(172); 
Person.Head(); 
Console.ReadLine(); 
} 
CLR 은 대상 을 처음 방문 할 때 이 대상 을 불 러 옵 니 다.여기 서 변 수 를 정의 할 때 Person 대상 온라인 스 택 에 메모 리 를 할당 합 니 다.처음 불 러 옵 니까?Student 대상 을 만 들 기 전에 Student 대상 을 불 러 오고 Student 유형 대상 에 메모 리 를 할당 하 며 Student 대상 을 구축 해 야 합 니 다.대상 의 주 소 는 스 레 드 스 택 에 저 장 된 부분 변수 student 에 저 장 됩 니 다.우 리 는 유형 대상 의 내용 을 알 고 있 습 니 다.유형 대상 지침,동기 색인 블록,정적 필드 와 방법(정적 과 비 정적)은 유형 대상 이 든 인 스 턴 스 유형 이 든 모두 유형 대상 지침,동기 색인 블록 이 있어 야 합 니 다.우 리 는 정적 필드 가 클래스 에 속 하고 이 클래스 의 모든 인 스 턴 스 에 의 해 공유 되 는 것 을 알 고 있 습 니 다.물론 정적 필드 의 메모 리 는 유형 자체 에서 분 배 됩 니 다.방법 도 클래스 의 모든 인 스 턴 스 가 공 유 됩 니 다.그의 메모리 도 유형 자체 에서 분 배 됩 니 다.모든 유형 대상 에 하나의 방법 표 가 있 고 클래스 에서 정의 하 는 방법 은 모두 대응 하 는 항목 이 있 습 니 다.
대상 의 인 스 턴 스 를 구성 할 때 유형 대상 포인터,동기 색인 블록,이 대상 의 인 스 턴 스 필드 에 메모 리 를 할당 해 야 합 니 다.대상 인 스 턴 스 의 경우 유형 대상 포인터 가 유형 대상 중 덕 정적 필드,방법 등 을 방문 할 수 있 습 니 다.
Student 는 스 레 드 스 택 에서 정 의 된 부분 변수 로 Student 의 인 스 턴 스 를 위탁 관리 더미 에 저장 하 는 주소 이기 때문에 Student 대상 의 필드 를 방문 할 수 있 습 니 다.방법 은 유형 대상 지침 을 통 해 유형 대상 Student 의 방법 표 에 있 는 대상 을 방문 하 는 것 입 니 다.
Say 방법의 실행 과정:변 수 는 student 이 가리 키 는 것 은 Student 대상 입 니 다.당연히 Student 유형의 대상 중의 Say 방법 을 호출 합 니 다.student 을 정의 할 때 Person 형식 이지 만 그 는 인용 유형 이기 때문에 위탁 관리 더미 에 있 는 Student 대상 의 메모 리 를 가리 키 고 이 대상 의 방법 표를 옮 겨 다 니 며 이 방법 을 찾 습 니 다.
특히 가상 방법 을 설명 합 니 다.JIT 는 가상 방법 에 추가 적 인 코드 를 추 가 했 습 니 다.방법 은 호출 할 때마다 이 코드 를 실행 합 니 다.이 코드 들 은 호출 된 변 수 를 검사 한 다음 에 이 변수 에 따라 응용 대상 을 찾 은 다음 에 이 대상 을 호출 하 는 방법 입 니 다.만약 에 이런 코드 가 없 으 면 CLR 은 부모 클래스 를 호출 하 는 방법 이 라 고 생각 합 니까?아니면 호출 하 는 방법 이 라 고 생각 합 니까?가상 방법 이 편 의 를 가 져 오 는 동시에 반드시 검사 해 야 할 코드 도 많아 졌 다.
SetHeight 방법의 실행 과정:Say 방법 앞 과 마찬가지 로 Student 대상 을 옮 겨 다 니 는 방법 표 에서 이 방법 을 찾 지 못 했 습 니 다.우 리 는 부모 클래스 에서 정의 하 는 비 private 방법 이 모두 하위 클래스 에 계승 할 수 있다 는 것 을 알 고 있 습 니 다.모든 유형 이 하나의 필드 를 정의 하여 그의 기 류 를 인 용 했 기 때 문 입 니 다.만약 에 하나의 호출 방법 이 자신 이 정의 한 것 이 아니라면.그러면 컴 파일 러 는 클래스 구 조 를 거 슬러 올 라 가 기본 Object 까지 관련 방법 을 찾 아 호출 하고 관련 방법 을 찾 지 못 하면 이상 을 보 고 했 을 것 이다.그래서 SetHeight 방법 은 사실 Person 의 SetHeight 방법 을 사용 합 니 다.
Head 방법의 실행:Head 방법 은 정적 방법 과 위의 두 가지 방법 이 다 르 기 때문에 정적 방법 을 호출 할 때 CLR 은 정적 방법 대상 과 의 유형 대상 을 찾 은 다음 에 인 스 턴 스 대상 에 대응 하 는 방법 표 에서 관련 기록 항목 을 찾 습 니 다.찾 지 못 하면 똑 같이 거 슬러 올 라 갑 니 다.
student.SetHeight(172)를 실행 하면;이 경우 student 은 인용 되 지 않 고 쓰레기 가 되 며,그 방법 이 되 돌아 오기 전에 회 수 됩 니 다.즉,student 인 스 턴 스 대상 은 회수 되 고,그 대상 은 회수 되 지 않 습 니 다.유형 대상 의 생 성 주 기 는 대상 이 CLR 에 불 러 와 있 는 AppDomain 이 마 운 트 해제 될 때 까지 입 니 다.정적 필드 는 그 가 인용 한 형식의 굽 이기 때문에 정적 형식 에 의 해 인 용 된 대상 은 영원히 회수 되 지 않 습 니 다.만약 에 집합 대상 을 인용 하고 그 안에 요 소 를 계속 추가 하면 메모리 가 유출 될 수 있 습 니 다.
이상 은 C\#운행 시 상호 관계 에 관 한 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기