2010-03-15 6 views
1

유닉스 박스에서 다음 명령을 실행하고 있습니다.java OutOfMemoryError

자바 -Xms3800m -Xmx3800m org.apache.xalan.xslt.Process -out CUST.TXT -in test13l.xml -xsl CustDetails.xsl

그 것이다 통해 파싱 Xalan에 프로세서를 호출하는 자바 명령 xsl 스타일 시트 (CustDetails.xsl)를 사용하여 xml 파일 (test131.xml)을 만들고 Cust.txt를 반환합니다.

명령이 제대로 작동하고 출력이 생성됩니다. 1.1GB의 xml 파일 크기를 처리하는 데 12 분이 걸립니다. 1.44GB의 파일 크기를 처리하는 데 22 분이 걸립니다. 나는 1.66 GB의 파일 크기를 처리하려고 할 때, 다음과 같은 메시지와 그 오류 아웃 :

XSLT 오류 (java.lang.OutOfMemoryError와) (오류 알 수없는 위치) : null가

내가 증가 3800 Java 힙 크기를 내가 뭘 더 할 수 있는지 확실하지 않습니다.

많은 도움에 감사드립니다.

+0

Xms 및 Xmx 매개 변수를 설정해도 JVM이 해당 양의 메모리를 힙에 할당한다는 것을 보장 할 수 없습니다. http://stackoverflow.com/questions/171205/java-maximum-memory-on-windows-xp http://www.unixville.com/~moazam/ 아래의 링크에서보세요 아마도 SAX 파서를 사용하고 파일에 직접 저장하는 것과 같은 다른 최적화를 고려해야합니다. – saugata

답변

1

64 비트 Java 프로세스 또는 32 비트 Java 프로세스를 실행하고 있습니까? 얼마나 많은 메모리가 실제로 시스템에 있습니까? OOM의 전체 스택 추적은 무엇입니까? 어떤 JVM 버전을 실행하고 있습니까? JConsole을 실행하고 힙을 덤프하고 Eclipse MAT와 같은 도구에서 열어서 어떤 오브젝트가 힙을 차지하고 있는지 확인할 수 있습니다. JVM 버전에 따라 -XX : + HeapDumpOnOutOfMemory를 사용하여 프로세스를 실행하고 Java 프로세스의 메모리가 부족한 후에 덤프를 열 수 있습니다.

0

메모리에 거대한 DOM 트리를 만드는 것이 길은 아닙니다. XSL Transformer에 SAX 또는 StAX API와 같은 XML 이벤트를 제공하는 방법을 찾으십시오. 엄청난 양의 XML 파일에 DOM API를 사용하지 마십시오 (1.1GB는 무서운 것 같습니다).

Java 6을 사용하는 경우 솔루션을 구현하기 위해 구현할 참조를 위해 javax.xml.transform.saxjavax.xml.transform.stax 패키지를 살펴보십시오.

2

Xalan은 아래에 DOM 또는 SAX 파서를 사용할 수 있습니다.

DOM 파서는 대개 전체 파일을 한 번에 읽고 트리를 만들어 대용량 파일에 많은 메모리를 사용합니다.

SAX 파서는 파싱하는 동안 이벤트를 발생 시키므로 전체 파일을 메모리에 보관할 필요가 없습니다 (그러나 트리를 쉽게 액세스 할 수는 없습니다).

Xalan이 아래에있는 SAX 파서를 사용하는지 확인하십시오. 이 작업 방법에 대한 설명은 여기에서 찾으실 수 있습니다 : http://xml.apache.org/xalan-j/usagepatterns.html#sax

관련 문제