none
Net 4.5 GC에 대해서 RRS feed

  • 질문

  • 안녕하세요.

    현재 Visual Studio 2010을 사용하고 있습니다. net 4.0에서 프로그램을 짜고 있는데,

    GC가 구동하면, 사용자 쓰레드가 정지 한다고, 문서에 나와 있네요.

    사용자 쓰레드가 정지 하면, 아주 심각함 계속적으로 데이타(센서)값을 확인 해야 하는데,

    GC가 구동하면, 사용자 쓰레드가 정지 한다면,,,

    질문?

    1.GC가 동작하는지 확인 할 수 있나요?

    2.GC가 동작 하더라도, 사용자 쓰레드가 정지 하지 않는 방법이 있나요?

    3.GC가 동작 한다면, GC가 구동 되는 시간...?


    lightdoll

    2013년 7월 14일 일요일 오전 6:50

답변

  • 바로 그런 특성 때문에 관리 응용 프로그램이 모든 환경에 적합한 것은 아닙니다. 예를 들어, 게임과 같은 경우도 그런데요. 이런 경우 GC 발생을 최대한 없애기 위한 팁들이 있습니다.

    [스크립팅] 효과적인 C# 메모리 관리 기법
    ; http://unitystudy.net/bbs/board.php?bo_table=writings&wr_id=55

    질문에 대한 답변이라면, GC 동작을 확인할 수 있는 방법은 부분적으로 RegisterForFullGCNotification / WaitForFullGCApproach 방법을 통해서 제공하긴 하지만 그다지 유용한 정도는 아닙니다. 2번은 방법이 없습니다. 3번은 1번의 답변에 소개한 메소드를 이용해서 직접 구하는 정도로 대략적인 시간을 알 수 있습니다. 그 외에, 성능 모니터링 수치를 폴링하는 방식으로 대략적인 수치를 추측할 수 있고, 그나마 확실한 것은 .NET Profiler 를 통해서 GC구동 시간을 알아낼 수 있겠지만 이 것은 질문하신 분의 상황에는 맞지 않을 것입니다.

    스레드 정지가 심각한 정도라면, 일부만 C#으로 만들고 센서값을 확인하는 부분에 대해서는 C++로 만들고 그 접합점을 C++/CLI로 처리하시는 것이 좋을 것입니다.

    2013년 7월 16일 화요일 오전 2:14

모든 응답

  • 바로 그런 특성 때문에 관리 응용 프로그램이 모든 환경에 적합한 것은 아닙니다. 예를 들어, 게임과 같은 경우도 그런데요. 이런 경우 GC 발생을 최대한 없애기 위한 팁들이 있습니다.

    [스크립팅] 효과적인 C# 메모리 관리 기법
    ; http://unitystudy.net/bbs/board.php?bo_table=writings&wr_id=55

    질문에 대한 답변이라면, GC 동작을 확인할 수 있는 방법은 부분적으로 RegisterForFullGCNotification / WaitForFullGCApproach 방법을 통해서 제공하긴 하지만 그다지 유용한 정도는 아닙니다. 2번은 방법이 없습니다. 3번은 1번의 답변에 소개한 메소드를 이용해서 직접 구하는 정도로 대략적인 시간을 알 수 있습니다. 그 외에, 성능 모니터링 수치를 폴링하는 방식으로 대략적인 수치를 추측할 수 있고, 그나마 확실한 것은 .NET Profiler 를 통해서 GC구동 시간을 알아낼 수 있겠지만 이 것은 질문하신 분의 상황에는 맞지 않을 것입니다.

    스레드 정지가 심각한 정도라면, 일부만 C#으로 만들고 센서값을 확인하는 부분에 대해서는 C++로 만들고 그 접합점을 C++/CLI로 처리하시는 것이 좋을 것입니다.

    2013년 7월 16일 화요일 오전 2:14
  • 답변 감사합니다.

    Perfmon으로 gc값을 보며는 계속적으로 증가 합니다.

    로그를 남기기 위해서,

    _logWriter.Write("PM1", "PM1 Stage Align Position이동을 시작 합니다.");

    public void Write(string source, string log)
            {
                lock (this)
                {
                    TimeSpan span = DateTime.Now.Subtract(_startTime);
                    if (_startTime.Day != DateTime.Now.Day || span.Minutes >= 30)
                    {
                        if (_logFw != null)
                        {
                            _logFw.Close();
                            _logFw.Dispose();
                            _logFw = null;
                        }
                        Create(_name);
                    }

                    try
                    {
                        if (!Directory.Exists(_defaultDirectory))
                            Directory.CreateDirectory(_defaultDirectory);
                        FileStream logFileStream = File.Open(_fullfileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
                        _logFw = new StreamWriter(logFileStream);
                        _logFw.WriteLine("{0}|{1}", DateTime.Now.ToString("HH:mm:ss.fff"), log);
                        if (_mainLoader != null)
                        {
                            _mainLoader.EventMessageWindow(source, String.Format("UpdateMessage|{0}|{1}|{2}", source, DateTime.Now.ToString("HH-mm-ss-fff"), log));
                        }

                    }
                    catch (ArgumentException ex)
                    {
                        Console.Write("LogWriter : {0}:{1}:{2}", _defaultDirectory, _fullfileName, ex.Message);
                    }
                    catch (Exception ex)
                    {
                        Console.Write("LogWriter : {0}:{1}:{2}", _defaultDirectory, _fullfileName, ex.Message);
                    }
                    finally
                    {
                        if (_logFw != null)
                        {
                            _logFw.Flush();
                            _logFw.Close();
                            _logFw.Dispose();
                            _logFw = null;
                        }
                    }
                }
            }

    이 부분에도 문제가 있을까요?

    그리고 닷넷 4.5에서 GC부분이 많이 개선되었다고 하는데 4.5으로 업그레이드 하며는 괜찮을까요?

    또 중지된 스레드는 GC가 작업이 완료 한 후, 바로 suspend되었다가 , 다시 진행 하나요?

    보통 GC가 동작하는 시간은 어느 정도 있지요?

    그럼 수고하세요.


    lightdoll

    2013년 7월 16일 화요일 오전 3:48