귀속으로 인한 StackOverflow의 분석

2877 단어 overflow
귀환은 여러 차원에서 이루어지는 것이 특히 중요하다. 여기서 우리는 귀환의 실현을 말하지 않고 귀환의 메모리 점용 상황을 이야기한다.
다음 코드는 우리가 실행할 때 간단합니다. Stack Overflow Exception은 순식간에 던집니다.여기는 확실히'순간'오류가 발생했습니다. 스레드가 넘쳐납니다.
먼저 우리는 하나의 프로그램이 하나의 프로세스 아래에서 실행되고 프로세스 아래에서 많은 스레드가 실행될 수 있지만 모든 스레드가 차지할 수 있는 메모리 컨트롤러는 유한하다는 것을 이해해야 한다. 약 1M이고 한 스레드가 1M을 초과할 때 Stack Overflow가 된다.온라인 스레드 창고에 저장할 수 있는 방법 중의 값 형식 변수와 인용 변수의 바늘 주소가 있습니다.이런 것들을 이해하면 우리가 왜 Stack Overflow를 초래했는지 나누어 줄 수 있다.
static void Main(string[] args)
{
      Main(args);
}

여기서 우리는 중요하지 않은 요소를 고려하지 않고 간단한 분석을 한다.
우선, 라인이 Main 방법을 실행한다. 우선 방법은 값 유형 변수가 없고 데이터만 ARgs이다. 모든 ARgs의 바늘 주소만 온라인 스택에 저장되고 4byte를 차지한다. Main에 Main 방법을 호출한다. 이렇게 반복적으로 호출하면 (4+4+4...+4)bytes에 해당하고 마지막에 1M에 이르면 Stack Overflow 이상을 초래한다.CLR 버퍼링 예외가 있습니다.
물론 이곳의 스레드 실행 방법은 간단한 분석일 뿐이고 실제 상황은 매우 복잡하다. 예를 들어 들어가는 방법은 전문적인 테이블 유지보수 방법 정보, 방법의 귀환 주소, 파라미터, 국부 변수가 있는데 이런 것들은 모두 스레드 창고 공간을 차지하고 방법이 귀환할 때 모든 방법이 차지하는 메모리가 방출된다.상술한 귀환은 영원히 방법 귀환이 존재하지 않기 때문에 자원은 방출되지 않고 최종적으로 이상을 던진다.
 
만약 상술한 것이 매우 간단하게 이해된다면, 우리는 두 줄의 코드를 추가한다.
 
static void Main(string[] args)
        {
            GC.Collect();
            GC.WaitForFullGCComplete();
            Main(args);
        }

이렇게 실행하는 방법, 이 코드는 내가 모 포럼의 한 게시자에게서 본 것이다. 그는 이렇게 하면 Stack Overflow를 초래하지 않을 것이라고 말했다. 그 결과 아래의 사람들은 좋지 않다고 믿었다. 나는 자원이 다 소모된 것을 확신했다. 단지 GC는 스레드 메모리를 회수할 수 없을 뿐이다. 그러나 내가 코드에서 실행할 때 상술한 코드는 확실히 틀리지 않고 계속 실행되고 있다. 당시에 내가 오류를 이해했는지 궁금했다. 이것은 과학적이지 않다!기다렸는데 과연 1분이 넘자 기대했던 Stack Overflow가 나타나 기뻐했다.
그런데 나 자신도 이해가 안 돼. 왜 위에 두 마디를 넣었는지 그렇게 오래 기다려서 빼야 하는지 이상해.나는 다른 사람에게 물었는데, 결과적으로 실험을 해서 GC 코드를 제거하고, Thread만 추가했다.Sleep(5)도 오랫동안 이상을 던질 수 있습니다. 난해 중입니다. 마지막으로 저는 다음과 같은 코드를 썼습니다.
static int a = 0;
static void Main(string[] args)
        {
            a++;
            Console.WriteLine(++a);
            Main(args);
        }

나는 방법이 몇 번이나 돌아가는지 보았다. 내 컴퓨터에는 a=12만 개가 넘는다. 즉, 최종 방법은 12만 개가 넘는다. 여러 번 Stack Overflow를 던졌고 모든 위의Thread를 던졌다.Sleep(5)이 장시간 실행되어야 오류를 보고할 수 있다는 결론을 내렸다. 매번 한 번씩 돌아가는 방법은 5밀리초를 듣고 1만 번 돌아가면 50초이다. 그래서 결론은 GC회수가 영향을 미치는 것이 아니라 매번 GC를 실행하고 라인Sleep을 실행하는 시간은 나로 하여금 장시간 동안 오류를 보고하지 않는다고 느끼게 한다.
 
위의 문제 자체는 큰 의미가 없다. 단지 필기로 기록할 뿐이고 마찬가지로 자신도 메모리의 점용을 더욱 깊이 이해했다.
 

좋은 웹페이지 즐겨찾기