none
Windows 2012 R2 Standard x64 Out Of memory Exception RRS feed

  • 질문

  • Hi. I have recently upgraded my windows 2008 R2 to Windows Server 2012 R2 x64 Standard. And, My system has 64Gb Memory. 

     When my app was running in my computer, I had a out of memory exception Error Message.
     My computer was using 20Gb memory of total 64Gb memory.

     As far as I know, 64 Bit OS System can use full physical memory size ( Here, 64 Gb).
     I don't know why My Computer displays an error message.

     Referentially,  

      1) Error Occurrence Method 

         public void UpLoadFabMainProcessHistory(string[] filenames, string tablename, string device)
            {
                if (filenames == null) return;

                
                CSVFileLoader cloader = new CSVFileLoader();

                DataTable table = new DataTable();

                foreach (string file in filenames)
                {
                   
                        string ext = Path.GetExtension(file).ToUpper();
                        
                        DataTable temptable = cloader.LoadFabMainProcessHistory(file);

                        // tempTable을 table에 Merge하여 하나의 Table로 만든다.
                        table = DataTableManager.MergeSameColumnDataTable(table, temptable); 
                }
             
                ByteTypeLoader bloader = new ByteTypeLoader();
                byte[] data = bloader.ConvertToBinaryType(table);

               
                PypsQuery q = new PypsQuery();
                q.DeleteTableDataOnly(tablename, device); 
                q.InsertDeviceTypeData(data, tablename, device, 98393877);
            }


     2) On Wndows 2008 R2 Standard, My Computer can run until 27Gb Memory, 
        But After upgrade to 2012 Standard, My Computer use only about 20Gb Memory.  
    2014년 7월 25일 금요일 오전 6:49

답변

  • 'Out of Memory Exception' 오류는 RAM의 크기(또는 물리적 메모리)와 관련 없이,
    프로세스(작성된 APP)가 사용하는 가상메모리 부족이 원인이 되어 발생합니다.
    그러므로, 작업 관리자나 성능 모니터를 사용해서, 해당 APP의 프로세스 메모리 크기를 잘 살펴볼 필요가 있어 보여요.

    다만, 64bit운영 체제를 사용 중에 Out of Memory 예외 오류가 발생한 것은 다소 특이한 경우로 생각되는데,
    먼저 그 APP이 32bit로 동작한 것이 아닌지 먼저 살펴볼 필요가 있어 보입니다.
    64bit운영체제라도, 32bit 프로세스 모드로 동작하면, 프로세스의 가상 메모리는 4GB로 제약됩니다.
    만일 64bit 모드로 그 APP이 동작했다면,
    프로세스 가상메모리의 조각화가 심각하게 진행되었는지를 의심할 필요가 있겠습니다.
    위의 코드로 보아서는 .NET Managed Heap 영역이 먼저 살펴볼 대상입니다.

    프로그램의 메모리 관련 이슈는 원인과 분석, 해결 방법이 꽤 다양해서,
    일단 가장 먼저 떠오르는 일반적인 사항들을 정리해 보았습니다. 도움이 되면 좋겠네요.

    2014년 7월 28일 월요일 오전 2:59

모든 응답

  • 'Out of Memory Exception' 오류는 RAM의 크기(또는 물리적 메모리)와 관련 없이,
    프로세스(작성된 APP)가 사용하는 가상메모리 부족이 원인이 되어 발생합니다.
    그러므로, 작업 관리자나 성능 모니터를 사용해서, 해당 APP의 프로세스 메모리 크기를 잘 살펴볼 필요가 있어 보여요.

    다만, 64bit운영 체제를 사용 중에 Out of Memory 예외 오류가 발생한 것은 다소 특이한 경우로 생각되는데,
    먼저 그 APP이 32bit로 동작한 것이 아닌지 먼저 살펴볼 필요가 있어 보입니다.
    64bit운영체제라도, 32bit 프로세스 모드로 동작하면, 프로세스의 가상 메모리는 4GB로 제약됩니다.
    만일 64bit 모드로 그 APP이 동작했다면,
    프로세스 가상메모리의 조각화가 심각하게 진행되었는지를 의심할 필요가 있겠습니다.
    위의 코드로 보아서는 .NET Managed Heap 영역이 먼저 살펴볼 대상입니다.

    프로그램의 메모리 관련 이슈는 원인과 분석, 해결 방법이 꽤 다양해서,
    일단 가장 먼저 떠오르는 일반적인 사항들을 정리해 보았습니다. 도움이 되면 좋겠네요.

    2014년 7월 28일 월요일 오전 2:59
  •  답변 감사드립니다.

     우선 운영체제와 Build는 모두 64Bit용 인것을 확인하였습니다.

     문제는 아직 해결 못했습니다.  다만 추정되는 원인은

                 foreach (string file in filenames)
                {  
                        DataTable temptable = cloader.LoadFabMainProcessHistory(file);                    
                        table = DataTableManager.MergeSameColumnDataTable(table, temptable); 
                }

      위 Code에서 하나의 "file" Size가 클 경우 발생하고 있습니다.  동일 File을 여러개로 나누어 하나의 File을 Load하고

    메모리 Clear 후 다음 File Load하고 하면 Total Data가 같더라도 OOM은 발생하지 않았습니다. 

     

     하지만, 64Bit Process를 처음 사용하는 거라 정확한 원인을 알고 싶습니다.  

     정확하지는 않지만 64Bit Process에서도 가상 메모리를 제한하는 것이 있다고 하는데, 정확히는 모르겠습니다.

    2014년 8월 14일 목요일 오전 2:28