본문 바로가기
IT 개발/에러

[JAVA] java.lang.OutOfMemoryError: Java heap space

by Dev.Jeon 2023. 1. 10.
반응형

에러메시지

java.lang.OutOfMemoryError: Java heap space 

12월 29, 2022 10:48:12 오전 org.apache.catalina.core.StandardWrapperValve invoke
심각: Servlet.service() for servlet [action] in context with path [/toms] threw exception [Handler processing failed; nested exception is java.lang.OutOfMemoryError: Java heap space] with root cause
java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3236)
	at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
	at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
	at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
	at sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:78)
	at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
	at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:282)

현상

LIST<VO>  변수에 몇 십 만 건의 데이터를 담아서

해당 데이터에 따라 JAVA 단에서 데이터 처리 후

하나씩 INSERT    

 

원인

 JAVA  heap 메모리 용량 부족

 

해결

결과적으로 저는 1번으로 해결 했습니다.

LIST<VO>에 담는 데이터 양을 대폭 줄여서 데이터를 처리하니 수월하게 INSERT 되었습니다.

만약 굳이 데이터를 많이 담아 처리해야 하는 상황이 아니라면 조금씩 줄여서 처리 해보는 걸 추천 합니다.

그외 나머지 방법은 아래 작성 했습니다.

 

1. 처리 해야하는 데이터 양 줄이기

2. 이클립스 eclips.ini 수정

3. 톰캣 catalina.bat 수정

4. 이클립스 상 톰캣 agument 수정


2번 이클립스 eclips.ini 수정

 

2-1 eclips.ini 파일 열기

2-2. 해당 파일 아래 이미지 블록 씌운 부분 중 xms 부터 아래 처럼 수정

이때 자신의 컴퓨터 용량에 맞게 수정 하시면 됩니다.(메모리 옵션 제일 하단 참조)

-Xms4096m

-Xmx6096m

-XX:MaxPermSize=6048m


3번 톰캣 catalina.bat 수정

 

3-1 tomscat 폴더/bin 안에 catalina.bat 열기

3-2. setlocal 삭제

set "CATALINA_OPTS=-Xms512M -Xmx6048M -XX:PermSize=256M -XX:MaxPermSize=6048M"

위 내용을 입력 합니다.

이때 자신의 컴퓨터 용량에 맞게 수정 하시면 됩니다.


4번 이클립스 상 톰캣 agument 수정

4-1. 이클릅스 내 톰캣 더블클릭

4-2. Open launch configuration 클릭

4-3. Arguments

-XX:MaxPermSize=4048m -Xms516m -Xmx6048m

메모리 수치를 본인의 컴퓨터에 맞게 수정 해주세요.

 

 

메모리 옵션

-XX:MaxPermSize=<size> : Permanent Generation의 최대 크기를 지정한다. Permanent Generation의 시작 크기는 PermSize옵션에 의해 지정된다. 

많은 수의 Class를 로딩하는 Application은 PermSize와 MaxPermSize옵션을 이용해 Permanent Generation의 크기를 크게 해주는 것이 좋다. 

Permanent Generation의 크기가 작을 경우에는 Out of Memory Error가 발생한다.

-Xms<size> : Java Heap의 최초 크기(Start Size)를 지정한다. Java Heap은 -Xms 옵션으로 지정한 크기로 시작하며 

최대 -Xmx옵션으로 지정한 크기만큼 커진다. 

Xmx<size> : Java Heap의 최eo 크기(Maximum Size)를 지정한다. -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx옵션으로 지정한 크기만큼 커진다. 

Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여할 것을 권장한다. 크기의 동적인 변경에 의한 오버 헤들를 최소화하기 위해서이다.

 

 


 

<참조사이트>

메모리 옵션 출처:https://epthffh.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A0%A8-%EC%84%A4%EC%A0%95

 

물고기 개발자의 블로그

웹개발을 하면서 알게된 유용한 상식들을 공유하는 곳입니다.

epthffh.tistory.com

해결 2~4번 출처 : https://lee-mandu.tistory.com/416

 

이클립스 java.lang.OutOfMemoryError: Java heap space

프로젝트를 진행하면서 에러가 발생하였습니다.아마 유명한 에러일듯 합니다. java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:3664)at java.lang.String.(String.java:207)at java.nio.HeapCharB

lee-mandu.tistory.com

 

반응형

댓글