c\#쓰레기 수 거(GC)최적화
GC
GC 는 이름 그대로 쓰레기 수집 입 니 다.물론 메모리 만 있 습 니 다.Garbage Collector(쓰레기 수집 기,헷 갈 리 지 않 는 상황 에서 도 GC)는 애플 리 케 이 션 의 root 를 기반 으로 애플 리 케 이 션 이 Heap 에서 동적 으로 분 배 된 모든 대상 을 옮 겨 다 니 며[2]이들 이 인용 되 었 는 지 여 부 를 식별 함으로써 어떤 대상 이 죽 었 는 지,어떤 대상 이 사용 되 어야 하 는 지 확인한다.더 이상 응용 프로그램의 루트 나 다른 대상 에 의 해 인용 되 지 않 는 대상 은 이미 사망 한 대상,즉 쓰레기 라 는 것 을 회수 해 야 합 니 다.이것 이 바로 GC 작업 의 원리 다.이 원 리 를 실현 하기 위해 GC 에는 여러 가지 알고리즘 이 있다.비교적 흔히 볼 수 있 는 알고리즘 은 Reference Counting,Mark Sweet,Copy Collection 등 이 있다.현재 주류 의 가상 시스템 인.NET CLR,Java VM 과 Rotor 는 모두 Mark Sweet 알고리즘 을 사용 하고 있다.네트워크
.NET 의 GC 메커니즘 에는 다음 과 같은 두 가지 문제 가 있다.
우선 GC 가 모든 자원 을 방출 할 수 있 는 것 은 아니다.그것 은 비 위탁 관리 자원 을 자동 으로 방출 할 수 없다.
둘째,GC 는 실시 간 이 아니 라 시스템 성능 상의 병목 과 불확실 성 을 초래 할 수 있다.
GC 는 실시 간 이 아니 라 시스템 성능 상의 병목 과 불확실 성 을 초래 할 수 있다.그래서 IDisposable 인터페이스 가 생 겼 습 니 다.IDisposable 인 터 페 이 스 는 Dispose 방법 을 정 의 했 습 니 다.이 방법 은 프로그래머 가 비 위탁 관리 자원 을 방출 하기 위해 명시 적 으로 호출 할 수 있 습 니 다.using 문 구 를 사용 하면 자원 관 리 를 간소화 할 수 있 습 니 다.
2.위탁 관리 자원 과 비 위탁 관리 자원
위탁 관리 자원 은.NET 에서 자동 으로 회수 할 수 있 는 자원 을 말 하 는데 주로 위탁 관리 더미 에 분 배 된 메모리 자원 을 말한다.위탁 관리 자원 의 회수 작업 은 인공 적 으로 관여 할 필요 가 없 으 며,.NET 운영 라 이브 러 리 는 쓰레기 회수 기 를 사용 하여 회수 하기에 적합 하 다.
비 위탁 관리 자원 이란.NET 이 어떻게 회수 하 는 지 모 르 는 자원 을 말 하 는데 가장 흔히 볼 수 있 는 비 위탁 관리 자원 은 포장 운영 체제 자원 의 대상 이다.예 를 들 어 파일,창,네트워크 연결,데이터 베이스 연결,브러시,아이콘 등 이다.이러한 자원,쓰레기 수 거 기 는 청소 할 때 Object.Finalize()방법 을 사용 합 니 다.기본적으로 방법 은 비어 있 습 니 다.비 위탁 관리 대상 에 대해 서 는 이 방법 에서 비 위탁 관리 자원 을 회수 하 는 코드 를 작성 하여 쓰레기 회수 기 가 자원 을 정확하게 회수 할 수 있 도록 해 야 합 니 다.
.NET 에 서 는 Object.Finalize()방법 을 다시 불 러 올 수 없습니다.컴 파일 러 는 클래스 의 분석 함수 에 따라 Object.Finalize()방법 을 자동 으로 생 성 하기 때문에 비 위탁 관리 자원 을 포함 하 는 클래스 에 대해 서 는 비 위탁 관리 자원 을 방출 하 는 코드 를 분석 함수 에 놓 을 수 있 습 니 다.
3.GC 최적화 에 관 한 예
정상 적 인 상황 에서 우 리 는 GC 와 같은 물건 을 관리 할 필요 가 없다.그러나 GC 는 실시 간 이 아니다.그래서 우리 의 자원 을 사용 한 후에 GC 가 언제 회수 할 지 확실 하지 않 기 때문에 메모리 누 출,메모리 부족 등 상황 을 가 져 올 수 있다.예 를 들 어 우리 가 약 500 M 의 큰 파일 을 처리 하고 사용 한 후에 GC 는 즉시 청 소 를 실행 하여 메모 리 를 방출 하지 않 는 다.GC 는 우리 가 다시 사용 할 수 있 을 지 모 르 기 때문에 기다 리 고 있 습 니 다.먼저 다른 것 을 처리 하고 시간 이 지나 면 이 물건 들 이 더 이상 사용 되 지 않 는 다 는 것 을 알 고 청 소 를 하고 메모 리 를 방출 합 니 다.
다음은 GC 에 사용 되 는 몇 가지 함 수 를 소개 합 니 다.
GC.SuppressFinalize(this); // 。
GC.GetTotalMemory(false); // 。 , , 。
GC.Collect(); // 。
GC 운영 체제코드 를 쓰기 전에 우 리 는 먼저 GC 의 운영 체 제 를 이야기 합 시다.GC 는 백 스테이지 스 레 드 라 는 것 을 잘 알 고 있 습 니 다.그 는 주기 적 으로 대상 을 찾 은 다음 에 Finalize()방법 으로 그 를 소모 합 니 다.우 리 는 IDispose 인 터 페 이 스 를 계승 하여 Dispose 방법 을 사용 하여 대상 을 없 앴 습 니 다.GC 는 모 릅 니 다.GC 는 여전히 Finalize()방법 을 호출 하지만.NET 에 서 는 Object.Finalize()방법 을 다시 불 러 올 수 없 기 때문에 반복 되 는 방출 을 막 기 위해 석조 함 수 를 사용 할 수 있 습 니 다.우 리 는 Dispose 방법 을 호출 한 후에 GC.SuperpressFinalize(this)방법 을 호출 하여 GC 에 이 대상 을 호출 하 는 Finalize()방법 을 알려 줄 필요 가 없다.
다음은 콘 솔 프로그램 을 새로 만 들 고 Factory 류 를 추가 하여 그 에 게 IDispose 인 터 페 이 스 를 계승 하 게 합 니 다.코드 는 다음 과 같 습 니 다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GarbageCollect
{
public class Factory : IDisposable
{
private StringBuilder sb = new StringBuilder();
List<int> list = new List<int>();
// ,
public void MakeSomeGarbage()
{
for (int i = 0; i < 50000; i++)
{
sb.Append(i.ToString());
}
}
// ,
~Factory()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (!disposing)
{
return;
}
sb = null;
GC.Collect();
GC.SuppressFinalize(this);
}
}
}
IDispose 인 터 페 이 스 를 계승 하여 이 클래스 를 사용 할 때 만 Using 문 구 를 사용 할 수 있 습 니 다.main 방법 에 다음 과 같은 코드 를 쓰 십시오.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace GarbageCollect
{
class Program
{
static void Main(string[] args)
{
using(Factory f = new Factory())
{
f.MakeSomeGarbage();
Console.WriteLine("Total memory is {0} KBs.", GC.GetTotalMemory(false) / 1024);
}
Console.WriteLine("After GC total memory is {0} KBs.", GC.GetTotalMemory(false) / 1024);
Console.Read();
}
}
}
실행 결 과 는 다음 과 같 습 니 다.자원 이 MakeSomeGarbage()함 수 를 실행 한 후의 메모리 사용량 은 1796 KB 이 고 방출 후 83Kb 가 되 었 습 니 다.코드 실행 메커니즘:
우 리 는 Dispose 방법 을 쓰 고 석조 함수 도 썼 다.그러면 그들 은 각각 언제 호출 되 었 을 까?우 리 는 각각 두 가지 방법 위 에서 단점 을 찍 었 다.디 버 깅 이 실 행 될 때 디 스 플레이 방법 위 에 먼저 가서 프로그램 이 실 행 된 후에 도 분석 함 수 를 가지 않 았 다 는 것 을 알 게 될 것 입 니 다.그것 은 우리 가 GC.SuperpressFinalize(this)방법 을 호출 했 기 때 문 입 니 다.이 방법 을 제거 한 후에 먼저 디 스 플레이 방법 을 발견 하고 그 다음 에 분석 함 수 를 가 는 것 을 발견 할 수 있 습 니 다.따라서 우리 가 Dispose 방법 을 호출 하면 GC 는 분석 함 수 를 호출 하여 대상 을 없 애고 자원 을 방출 한 다 는 것 을 알 수 있다.
4.GC.Collect 를 언제 호출 해 야 합 니까?
여기 서 효 과 를 보 여 드 리 기 위해 서 저 는 호출 된 GC.collect()방법 을 보 여 드 리 고 GC 에 메모 리 를 즉시 방출 하 라 고 했 습 니 다.그러나 GC.collect()방법 을 자주 호출 하면 프로그램의 성능 을 떨 어 뜨 릴 수 있 습 니 다.우리 프로그램 에서 많은 메모 리 를 사용 하지 않 으 면 바로 방출 해 야 호출 을 표시 할 수 있 습 니 다.다음은 공식 문서 의 설명 입 니 다.
쓰레기 수 거 GC 클래스 제공 GC.Collect 방법,프로그램 이 쓰레기 수 거 기 를 어느 정도 직접 제어 할 수 있 도록 이 방법 을 사용 할 수 있 습 니 다.일반적으로 쓰레기 수 거 기 를 독립 적 으로 실행 할 수 있 도록 모든 회수 방법 을 사용 하 는 것 을 피해 야 합 니 다.대부분의 경우 쓰레기 수 거 기 는 수 거 를 실행 하기에 가장 좋 은 시 기 를 정 하 는 데 유리 하 다.그러나 일부 자주 발생 하지 않 는 상황 에서 강제 회 수 는 응용 프로그램의 성능 을 향상 시 킬 수 있다.응용 프로그램 코드 의 특정한 점 에서 사용 하 는 메모리 가 대량으로 줄 어 들 때 이 경우 사용 합 니 다. GC.Collect 방법 이 적당 할 것 같 습 니 다.예 를 들 어 응용 프로그램 은 대량의 비 위탁 관리 자원 을 인용 한 문 서 를 사용 할 수 있 습 니 다.프로그램 이 이 문 서 를 닫 았 을 때 문서 에 사 용 된 자원 이 더 이상 필요 하지 않다 는 것 을 완전히 알 고 있 습 니 다.성능 때문에 한 번 에 이 자원 들 을 모두 방출 하 는 것 은 매우 의의 가 있다.더 많은 정보 에 대해 서 는 참고 하 시기 바 랍 니 다. GC.Collect 방법
쓰레기 수 거 기 는 수 거 를 실행 하기 전에 현재 실행 중인 모든 스 레 드 를 걸 것 입 니 다.하면,만약,만약... GC.collect,성능 에 문제 가 생 길 수 있 습 니 다.GC.Collect 를 호출 하지 않도록 주의해 야 합 니 다. 프로그램 에서 사용자 가 자주 호출 할 수 있 는 점 에 코드 를 두 었 습 니 다.이 는 쓰레기 회수 기 에서 엔진 을 최적화 하 는 역할 을 약화 시 킬 수 있 으 며,쓰레기 회수 기 는 쓰레기 수 거 를 실행 하 는 가장 좋 은 시간 을 확정 할 수 있다.
이상 은 c\#쓰레기 수 거(GC)최적화 에 관 한 상세 한 내용 입 니 다.c\#쓰레기 수 거(GC)최적화 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.