2013-02-27 2 views
1

Excel을 읽고 전자 메일을 보내는 작은 유틸리티를 만들려고했습니다. 나는 그것을 위해 ApachePOI 라이브러리를 사용하고있다. 이클립스에서 코드를 실행할 때 처음에는 java.lang.OutOfMemoryError: GC overhead limit exceeded 오류가 발생했습니다. 그런 다음 이클립스의 VM 인수와 프로그램에서 -Xms1024m을 추가하여 Eclipse에서 잘 작동했습니다.Java 힙 공간 오류 (명령 줄에서)

그런 다음 Java 프로그램 세트와 라이브러리 세트를 RunnableJar로 내 보낸 다음 종속 라이브러리를 번들로 제공합니다.

지금 명령 줄에서 내가 명령

java -Xms1024m -jar AutomateProcesses.jar 

나는 여전히 같은 오류를 얻고을 실행할 때. 문제를 파악할 수 없습니다. 이 점에 대해 누군가 도와 주시겠습니까?

+0

가능한 [GC 오버 헤드 한도 초과] (http : // stackoverflow.com/questions/4371505/gc-overhead-limit-exceeded) – nfechner

+0

방금 ​​오류를 게시했으며 가비지 수집에 문제가있는 것으로 보입니다. –

+0

@dasKeks 문제 해결 방법을 알려주세요. – TechyHarry

답변

1

당신은

java -Xms512m -Xmx2048 -jar AutomateProcesses.jar 

을 시도 할 수 있습니다. java 프로세스의 라이브러리가 별도의 프로세스를 생성하는 경우 라이브러리는이를 구성하기 위해 다른 옵션이 필요할 수 있습니다.


편집 :

this question에 대한 답변은 GC가 메모리를 복구하려고 너무 많은 시간을 소비하고 받고 있지 않기 때문에이 오류가 있음을 지적한다. Apparel POI에 익숙하지 않지만 Excel에서 Java로 얘기하고 있다면 아마도 Excel DLL에 COM 호출을 사용하고있을 것입니다. 라이브러리에 버그가 있거나 사용법에 따라 가비지 수집에서 개체가 잠겨서 GC가 거의 진행되지 않고 매우 열심히 작동 할 수 있습니다.

이 문제가있는 코드를 더 작은 테스트 케이스로 격리하려고 시도 할 수 있습니까?

post은 많은 수의 cellStyle 개체가 생성되는 것을 피하기 위해 Excel에서 셀을 처리하는 방식을 다시 작성하는 것과 비슷한 정도의 문제가있었습니다.

비슷한 맥락에서 this person은 데이터를 포기하고 CSV 형식으로 데이터를 썼습니다.

+0

여전히 동일한 오류 – TechyHarry

+0

Linux 터미널에서이 오류가 발생합니다. 하지만 리눅스 일식에서 잘 작동합니다. – TechyHarry

+0

64 비트 자바가 실행 중입니까? 그렇다면 당신은 메모리를 많이 올리려고 할 수 있고 그게 효과가 있는지 볼 수 있습니다 (당신은 mem/vmem이 적당하다고 가정). 해결책이 아닌 해결 방법입니다. –

1

최대 힙 크기를 설정하고 Java VM이 더 많은 메모리를 할당 할 수있게하려면 -Xmx1024M (또는 -Xmx1G) 명령을 사용해야합니다.

-Xms는 각각 최소 힙 크기를 설정합니다. 이것이 내가 기대되는이 VM에서 벌어 단지 무슨 경우

+0

방금 ​​-Xms도 작동해야한다는 것을 알았습니다. 그래서 제 대답은 해결책이 아닙니다. –

+0

여전히 동일한 오류 – TechyHarry

0

java.lang.OutOfMemoryError : GC overhead limit exceeded은 JVM 가비지 수집에 문제가있는 증상입니다 (GC에서 너무 많은 시간이 소요됨). 이 오류는 실제로 전체 JVM이 정지 상태가되는 것을 막아 여분의 통계를 수집 할 수있게합니다.

엑셀 시트를 읽는 것은 GC 프로세스에 압력 점을 추가 할 파일의 크기에 따라 메모리 집약적 일 수 있습니다.

verbose를 활성화하고 분석하면 분명히 도움이 될 것입니다. JVM Heap Dump을 생성하고 Java 유틸리티 프로그램에서 해당 메모리가 어디에 저장되어 있는지 판별 할 수도 있습니다. Java 힙 크기를 조정하거나 결함있는 메모리 보유를 해결해야합니다.