2016-06-09 2 views
0

PDFBox 2.0.1에서 PDF를 렌더링 할 수 없으므로 문제가 있습니다. PDFBox가 몇 개의 파일에서 실패할지는별로 신경 쓰지 않지만 문제는 전체 스레드가 멈추고 몇 분 동안 반환되지 않으며 메모리가 계속해서 생성되어 결국에는 끝이 보이지 않는 것입니다.PDFBox 2.0.1이 응답하지 않습니다. pdf 페이지

PDFRenderer renderer = new PDFRenderer(document); 
BufferedImage image = renderer.renderImageWithDPI(0, 96); //Gets stuck here 
ImageIO.write(image, "PNG", new File(fileName)); 

코드가 특정 줄에 걸리면과 CPU 및 메모리를 소모 :

문제는 이것이 내가 그것을 호출하는 방법입니다, RenderImageWithDPI으로 보인다. 넷빈에서는 실행을 일시 중지 할 때마다이 스택 추적을 봅니다. PDFBox가 작동하는 것을 보면서 무슨 일이 일어나고 있는지 확신 할 수 없지만 일종의 무한 루프를 치는 것처럼 보입니다.

사람이 PLS 도울 수 https://drive.google.com/file/d/0B5zMlyl8rHwsY3Y1WjFVZlllajA/view?usp=sharing :

enter image description here

문제의 PDF에서 다운로드 할 수 있습니까?

답변

2

당신은 자바 8에 있습니까? here을 설명하고있는 바와 같이,이 옵션으로 자바를 시작

이 필요 JDK8 관련이
-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider 

는 색상 관리 시스템을 전환했다.

매우 복잡하기 때문에 파일의 렌더링 속도가 느립니다 (20-30 초).

(Btw은 끊지 않았다 렌더링. 그냥 아주, 아주 오래 걸려서, 즉 몇 분)

+0

답장을 보내 주셔서 감사합니다. 훌륭하게 작동했습니다. 나는 여전히 KCMS를 사용하는데 예약이되어있다. 코드는 단지 pdf가 아닌 다양한 파일 유형이라면 엄지 손톱을 만드는 큰 서비스이다. KCMS에 대해 알려진 모든 문제가 있습니까? 나는 파일의 몇 가지를 시도하고 그것 모두는 내가 장기적으로 우려하고 있지만 작동하는 것 같다 –

+0

@ ZaidAmir 나는 어떤 문제에 대해 들어 보지 못했어요. KCMS는 JDK7까지 사용되었습니다. 알려진 문제이지만, 우리뿐만 아니라 오라클이 가운데 손가락을 보여줍니다. https://bugs.openjdk.java.net/browse/JDK-8041125 https://blog.idrsolutions.com/2014/04/color-performance-change-newer-java-releases/ (경쟁 업체의 것임) –

0

이 문제는 자바 8 VM에서 재현 할 수 있습니다. @Tilman은 이미 그의 대답에서 언급했듯이 Java 8이 이전 Java 버전과는 다른 색상 관리 시스템을 사용하여 도입 한 문제입니다.

새로운 색상 관리 시스템을 사용하여 VM 동작을 분석하면 과도한 메모리 사용으로 인해 문제가 실제로 메모리 누수 문제가 아닌 것으로 확인됩니다. 대신 가비지 콜렉션이 사용되지 않는 오브젝트를 수집하고 해제 할 수있는 것보다 빨리 오브젝트를 인스턴스화합니다!

하나 PDFStreamEngine.processStreamOperators(PDContentStream) 페이지 콘텐츠 파싱 메인 루프 변화에 의해 페치 가비지 수집을 허용 할 수

int i = 1;       // new 
while (token != null) 
{ 
    if (token instanceof COSObject) 
    { 
     arguments.add(((COSObject) token).getObject()); 
    } 
    else if (token instanceof Operator) 
    { 
     processOperator((Operator) token, arguments); 
     arguments = new ArrayList<COSBase>(); 
    } 
    else 
    { 
     arguments.add((COSBase) token); 
    } 
    token = parser.parseNextToken(); 
    if (i++ % 1000 == 0)   // new 
     Runtime.getRuntime().gc(); // new 
} 

(1000 내가 허공 선택한 임의의 가치.)

이것 여전히 느리지 만 과도한 메모리 사용없이 비트 맵을 생성합니다.


따라서, 덜 임시 개체 및/또는 명시 적으로 허용 가비지 콜렉션에서 단계 이전 색상 관리 시스템 인스턴스화 방법처럼 보인다


PS :.이상 변화하지 않는 빠른 것들 최대. 단지 은 초과 메모리 사용을 방지합니다. OP가 관찰되었으며 내 테스트 설정에서 OutOfMemory 상황이 발생했습니다.

OP가 배포 환경을 완벽하게 제어 할 수있는 경우 실제로 응답에 표시된 @Tilman 옵션을 사용해야합니다. OP가 아니라면, 예를 들면. 관리자가 결국 웹 서버에 배치하면 관리자가 관리하지 않으며 관리자가 JVM 시작 옵션을 추가하지 않으려는 경우 적어도 과도한 메모리 사용을 막을 수 있습니다.

+0

https://stackoverflow.com/questions/2414105/why-is-it-bad-practice-to-call-system-gc –

+0

@Tilman 그 질문은 그 문제에 대한 일반적인 진술에는 좋지만 언제나 그렇듯이 일반적인 대답은 올바른 상황에서 무시할 수없는. – mkl

+0

변경을 시도했지만 여전히 느립니다. 설정으로 20 ~ 30 초가 소요됩니다. 설정을 변경하지 않고 PDFDebugger (72dpi)에서 1000 초가 걸립니다. –

관련 문제