일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- custom valid
- docker 설치
- dto valid
- 도커
- ollama langflow
- jvm
- React
- NextJS
- swagger
- 초기 세팅
- java8
- JavaScript
- CentOS6
- Java
- memcached
- 초기 구축
- spring
- Next.js 14
- generate pojos
- MySQL
- header setting
- docker
- JPA
- 리눅스
- java9
- generate entity
- jpa entity자동
- 헤더 설정
- spring boot
- SpringBoot
- Today
- Total
개발자의 길
JVM의 default heap size 확인(리눅스, 윈도우) 본문
1. 개요
java를 실행시킬 때, 혹은 WAS를 설치/구성 후 기동할 때 JVM옵션에 Heap, Perm 등의 설정을 넣지 않고
운영하다 쏟아져들어오는 요청들에~ 메모리를 많이 필요료하는 로직들에 의해 OutOfMemoryError를 종종 만나시게 되는데요~
(물론 설정해둬도 날 수 있는 에러지만요..ㅎㅎ)
이 size size SIZE!! 들을 설정하지 않았을 때 대체 default 값이 얼마였길래 OOME가 났었던 걸까 궁금하셨던 분 안계신가요?
java doc에 따르면 Sun/Oracle Windows and Solaris/Linux JVMs의 default는 64MB라고 합니다. 하지만 이 값은 JVM 벤더마다 다를 수 있다~ 라고 이야기하고 있죠.
JRockit의 경우의 max heap size 계산법이 또 다르거든요..
만약...내 JVM이 최대 얼마만큼의 메모리를 사용할 수 있으려나..궁금하신 분들! 이렇게 런타임 시에 확인 가능하다고 합니다.
:
System.out.println("Total Memory : "+Runtime.getRuntime().totalMemory());
System.out.println("Free Memory : "+Runtime.getRuntime().freeMemory());
System.out.println("Max Memory : "+Runtime.getRuntime().maxMemory());
여튼..다시 본 주제로 돌아와서! default size를 확인하는 방법을 알아볼께요~
2. Java Default Heap/Perm Size 알아내는 방법
[Linux] java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
(java8 이상 쓰면 permsize 대신 metaspacesize 로)
[Windows] java -XX:+PrintFlagsFinal -version 2>&1 | findstr /I "heapsize permsize version"
3. 확인 결과
[Linux]
: 123MB 정도를 heap 초기치로 잡네요! max heap은 1970MB 정도이고 perm 초기값은 20MB 정도네요!
==> 어떻게 이렇게 계산이 되는지는 일단 확인 결과 보고 알려드리죠.ㅎㅎ
# java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
uintx AdaptivePermSizeWeight = 20 {product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 128983616 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 2065694720 {product}
uintx MaxPermSize = 174063616 {pd product}
uintx PermSize = 21757952 {pd product}
java version "1.7.0_79"
※ java 1.8 이상을 사용하신다면,
permsize 대신 아래처럼 metaspacesize로 적절히 대체하시어 확인하시면 됩니다! :)
[Windows]
D:\>java -XX:+PrintFlagsFinal -version 2>&1 | findstr /I "heapsize metaspacesize version"
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialBootClassLoaderMetaspaceSize = 4194304 {product}
uintx InitialHeapSize := 134217728 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 2147483648 {product}
uintx MaxMetaspaceSize = 4294901760 {product}
uintx MetaspaceSize = 21807104 {pd product}
java version "1.8.0_111"
4. 어떻게 이렇게 초기 값을 잡게 되나요?
오라클 java 문서(http://www.oracle.com/technetwork/java/ergo5-140223.html) 에 따르면,
jvm을 server class로 실행하면 초기 heap size는 메모리의 1/64 이고, 최대 heap size는 1/4까지 늘어난다고 합니다.
그래서, 제가 확인했던 Linux 서버의 결과 값이 어떻게 나왔냐구요?
아래는 top 결과 입니다. 이 서버에 총 8GB의 메모리가 할당되어 있죠.
그렇게 해서, heap size 초기 값은 8GB의 1/64 인 123MB, 최대 값은 8GB의 1/4인 1970MB로 계산이 됩니다.
'4. JAVA' 카테고리의 다른 글
[java] spring Interceptor 에서 DB(mybatis) connection 연동 하기 (0) | 2019.11.15 |
---|---|
[java] java9(자바9) 새로운 기능 - 변화와 특징 요약 (1) | 2019.10.17 |
springboot - apache - tomcat 연동(springboot 내장톰캣) (0) | 2019.04.30 |
spring security 파헤치기 (구조, 인증과정, 설정, 핸들러 및 암호화 예제, @Secured, @AuthenticationPrincipal, taglib) (0) | 2019.04.10 |
[javascript/java] spring/jsp-javascript(server/client) websocket 통신 예제 (0) | 2018.01.12 |
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.