2008-10-06 6 views
2

저는 타사 구성 요소를 사용하여 ABCpdf.Net이라는 VB.Net 웹 시스템에서 동적 PDF를 작성하고 있습니다. (끔찍한 도구는 아니지만 위대한 도구는 아닙니다.)지금은 ABCpdf가 메모리가 부족합니다.

때때로 나는 짐작할 수없는 이유 때문에 문서 객체가 SEHException을 던집니다. WebSupergoo.ABCpdf.Internal.PDFException 유형의 문서 객체에서 사용자 정의 예외가 원인 인 것으로 나타났습니다. 내용에는 크게 도움이되는 제목 인 "이미지 데이터를 가져올 수 없습니다. 메모리 부족"이 포함되어 있습니다. 일반적으로 이미지를 PDF에 추가하려고 할 때 발생합니다. 이 이미지는 100k 미만의 PNG이므로 크기가 문제가 아니라고 생각합니다.

또한 정말로 이상한 일은이 문제가 발생하기 시작하면 웹 서버를 재부팅하는 것이 유일한 방법 인 것처럼 보입니다.이 작업은 분명히 약간의 하위 작업입니다.

는 누구도이 문제를했다 (심지어이 도구를 사용?) 나는 특별히 전에이 오류를 보지 못했다

답변

2

업데이트 :로 근처에 우리가 그 버전 7을 보일 수있을 것입니다 7. ABCpdf 6에서 업그레이드 할 때 내가 메모리 문제가 모두 해결 된 말할 수

는 더 이상이있는 COM 객체입니다 . NET 래퍼,하지만 모든 관리 코드를 아래에서 위로. 그곳에서 여전히 최고의 PDF 생성기는 아니지만 자원 처리 문제가 해결 된 것 같습니다.

+2

이것은 일종의 선택이지만 ABCpdf 7은 여전히 ​​"모든 관리 코드"라고 확신합니다. 특히, 핵심 코드 ABCpdfCE7.dll (C : \ Windows \ System32에 설치됨)이 있습니다. 관리 코드가 아닌 것으로 나타납니다. 예를 들어 .NET의 corflags 유틸리티를 실행하려고하면 corflags가 "지정된 파일에서 유효한 관리되는 헤더가 없습니다. "), ABCpdf.dll .NET 어셈블리로 래핑 된 가져옵니다. 후자의 어셈블리는 COM에 의존하지 않고 "순수한. NET"인 것처럼 보입니다. (또는 어떻게 든 COM에 의존한다면, 당신의 모든 세부 사항을 숨 깁니다.) – Chris

+0

@Chris - 맞아. 여전히 COM은 없어 졌거나 멀리 숨어있어 더 이상 문제가되지 않습니다. 어쨌든 업그레이드 후 일주일에 한 번 웹 서버를 재부팅하지 않아도되었습니다. –

1

, 그러나 우리는 전에 ABC의 PDF와 메모리 문제를 했어했습니다.

간단히 말하자면 완전히 관리되는 코드베이스는 아니지만 단순히 COM 버전 주위의 .NET 래퍼입니다. 즉, 우리는 메모리 사용 문제를 추적하여 개체를 올바르게 처리하지 못하게했습니다.

그래서, 대신 :


Dim doc As New Doc() 
'etc... 

이 작업을 수행 :


    Dim doc as Doc 
    Using doc As New Doc() 
     'etc... 
    End Using 
+0

그렇다면 100 % 순수 관리가 아닌 경우 어떻게해야합니까? 그것은 IDisposable을 구현하고 그것을 처분하지 않았습니다. 오류가 발생하면 .NET에서 신중한 개체 수명 관리가 필요하다는 사실을 알아야합니다. – gbjbaanb

+0

ABC PDF를 비난하지 않았습니다. "우리는 그들의 물건을 적절히 처분하지 않았다." 그러나 관리되는 리소스를 삭제하지 않으면 관리되지 않는 리소스를 삭제하지 않는 것과는 다른 결과가 발생할 수 있으며 여기에서 ABC PDF가 실패하기 시작합니다. –

+1

또한 ABCpdf 문서는 IDisposable을 구현한다고 말하지 않으며 실제로 Doc 객체를 처리 할 필요가없는 상태가 더 많거나 적습니다. –

2

매혹적인. 나는 계속되어야 할 결론이었습니다. using 블록의 끝에있는 doc.Clear()를 여전히 호출합니까?

나중에 3 달
+0

Doc의 처분 방법이 당신을 위해 그것을 처리한다고 나는 믿지 않습니다. –

+0

감사합니다. –

+0

호기심에서 ABCpdf 7 .NET 어셈블리 사본에 디스어셈블러를 실행했습니다. Dispose()는 Clear()가 사용하지 않는 여러 항목 (예 : mObjects, mEncryption, mTransform)을 명확하게 정리합니다. Dispose()를 호출하면 Clear()가 중복되는 것 같지만 100 % 확실하지는 않습니다. (WebSupergoo.ABCpdf7.Internal.NDoc.Clear가 WebSupergoo.ABCpdf7.Internal.NDoc.Delete가 수행하는 것 이상으로 정리 작업을 수행하는지 여부에 따라 달라집니다. 아닐 수도 있지만, 관리되는 코드를 참조하십시오.) – Chris