JVM Option ์ค์ ์ ๋ํ์ฌ
JVM (Oracle) Options
-Xms, -Xmx
-Xms
- JVM ์์์์ Heap size
-Xmx
- ์ต๋ Heap size
-Xms, -Xmx
๋ฅผ ์ด๋ป๊ฒ ์
ํ
ํ๋ ๊ฒ์ด ์ข์๊น?
-Xms, -Xmx
๋ฅผ ๋์ผํ๊ฒ ์ ํ ํ๋ ๊ฒ์ ์ถ์ฒ.- Heap ์ฌ์ด์ฆ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด ๋ฐํ์ ๊ธฐ๊ฐ๋์ ๋ฐ์ํ๋ ๋ถํ์ํ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์๋ค.
- ๊ณผ๊ฑฐ์ JVM ๊ธฐ์ค์ผ๋ก ๋ด๋ ค์ค๋ ์ค์ ๋ฐฉ๋ฒ์ด๋ผ๋ ์๊ฒฌ์ด ์๋ค.
- ์ต์ JVM์์๋ ์ค์ ์ํ๋ ๊ฒ์ ์ถ์ฒํ๋ค๊ณ ํ๋๋ฐ ํ ์คํธ๋ฅผ ์งํํ๊ณ ํ์ธํด๋ด์ผ ํ๋ค.
- Reference
In very early versions of the adaptive sizing algorithms there may have been some advantage to running with this combination, but for modern workloads itโs almost always counterproductive. If you set this combination, the JVM is constrained in how it can resize and shape the heap, making it less responsive to sudden changes in traffic behavior or request rate.
๊ทธ๋ผ Heap Size๋ฅผ ์ด๋ ์ ๋๊น์ง ์ค์ ํ๋๊ฒ ์ข์๊น?
32bit
์ด์์ฒด์ ์ธ ๊ฒฝ์ฐ ์ต๋ Heap Size๋2^32 = 4GB
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.64bit
์ด์์ฒด์ ์ธ ๊ฒฝ์ฐ ์ต๋ Heap Size๋ ๊ทธ๋ณด๋ค ๋ ๋ง์ด ์ฌ์ฉํ ์ ์๋ค.- ํ์ง๋ง ํฌ์ธํฐ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋จ์ ์ด ์๋ค.
- Java์์๋ ๋ ๋ง์ Heapsize์ ์์ ํฌ์ธํฐ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Compressed Ordinary object pointers๋ฅผ ์ฌ์ฉํ์๋ค.
- ์ค์ ๋ก ์ฃผ์๊ฐ ์๋ ์ฃผ์์ Offset์ 8์ ๋ฐฐ์๋ก ๊ณ์ฐํ์ฌ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ต๋ ํ์ฌ์ด์ฆ๋
4GB -> 32GB
๋ก ์ฆ๊ฐํ๊ฒ ๋๋ค. - ์ต๋ ํ ์ฌ์ด์ฆ๊ฐ
32GB
๋ฅผ ๋์ด์๊ฒ ๋๋ค๋ฉด JVM์64bit ๊ธฐ๋ฐ์ OOP
๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. - ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ElasticSearch์์๋ ์ต๋ HeapSize๋ฅผ 32GB ์ดํ๋ก ๊ถ์ฅํ๋ค.
ํญ์ Heap Size๊ฐ ํฌ๋ค๊ณ ์ข์๊ฒ์ผ๊น?
- ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ผ ๊ฒฝ์ฐ 2GB์ ํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ 8GB ํฌ๊ธฐ์ ํ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํ GC์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์งง์ ์๋ต ๋ฐ์์ฑ์ ์ ๋ฆฌํ๋ค.
- ํ์ง๋ง 8GB ํ์ ์ฌ์ฉํ๋ฉด 2GB๋ณด๋ค ํ GC ๋ฐ์ ๊ฐ๊ฒฉ์ด ๊ทธ๋งํผ ์ค์ด๋ค ๊ฒ์ด๊ณ ๋ด๋ถ ์บ์๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด ํํธ์จ์ ๋์ฌ ์๋ต ๋ฐ์์ฑ์ ๋์ผ ์ ์๋ค.
- ์ด๋ ๊ฒ์ ์ ํํด๋ Trade-off๊ฐ ๋ฐ์ํ๊ธฐ์ ์ํฉ์ ๋ง๊ฒ ์ ์ ํ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์ฐพ์.
JVM DNS Cache
- JVM ๋ด๋ถ์์๋ DNS Cache๋ฅผ ํ๋ค. DNS ๋ณ๊ฒฝ์ ๋ฐ๋ก ๋ฐ์์ด ๋๋ ค๋ฉด ์บ์๋ฅผ ์์ ๋ ํธ์ด ์ข์๋ณด์ธ๋ค.
networkaddress.cache.ttl
sun.net.inetaddr.ttl
-1
- ์์์ ์ธ ์บ์๋ฅผ ์ง์ํ๋ค.0
- ์บ์๋ฅผ ์์ค๋ค.
JVM Server ๋ชจ๋
-client
- JIT(Just in time) Compiler๋ฅผ ์ฌ์ฉํ๊ธฐ์ ์๋ฒ ์์ ์๊ฐ์ ๋นจ๋ผ์ง๊ณ ๋ ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋(foot-print)๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ณดํต GUI ์์คํ , ์์ ์์คํ ์ ๊ตฌ๋ํ๋๋ฐ ์ฌ์ฉํ๊ธฐ ์ข๋ค.
-sever
- client ๋ชจ๋๋ณด๋ค ๋ ๋ง์ ์ต์ ํ๋ฅผ ์งํํ๋ค.
- ๋น ๋ฅธ Operation์ด (์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๋น ๋ฅธ ์์ ์๊ฐ)๋ณด๋ค ๋ ์ค์ํ ์ํฉ์์ ์ฌ์ฉํ๋ฉด ์ ์ ํ๋ค.
-XX:MaxPermSize=
, -XX:PermSize=
- JVM 1.8 ์ด์ ์๋ Permanent์์ญ์ด ์กด์ฌํ์๋ค.
- ํด๋น ์์ญ์ Class์ Meta ์ ๋ณด, Method์ Meta ์ ๋ณด, Static๋ณ์, ์์ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ
- ํด๋น ๊ธฐ๋ฅ์ ๋ง์ ํด๋์ค๋ค์ ๋ก๋ํ๋ ๊ฒฝ์ฐ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ ์ถ์ฒํ๊ณ ์๋ค.
- ํด๋น ๊ธฐ๋ฅ์ 1.8 ์ดํ๋ก Deprecated๋์๋ค.
- Native Memory ์์ญ์ผ๋ก ์ด๋ํ์ฌ Metaspace์์ญ์ผ๋ก ๋ฐ๋๊ฒ ๋์๋ค.
- JDK 8์์ Perm ์์ญ์ ์ ์ญ์ ๋์๊น
- Java 8 ์์ ์ฌ๋ผ์ง maxPermSize, PermSize์ ๋์ฒดํ๋ ์ต์ ?
-XX:UseContainerSupport
- JVM์ด ์ฌ์ฉ ๊ฐ๋ฅํ CPU์ RAM์ ์ฆ cgroup limits๋ฅผ ์ฝ์ด๋ค์ผ ์ ์๊ฒ ํ๋ ์ต์ ์ด๋ค.
- ํด๋น ์ต์ ์ Java 8u191+ ์ดํ๋ก Default๋ก ๋ณ๊ฒฝ๋์๋ค.
JIT Compiler option
-XX:CompileThreshold
- ํน์ ๋ฉ์๋๊ฐ ์ผ์ ํ์ ์์ ์คํ๋๋ฉด JIT Compiler๊ฐ native ์ฝ๋๋ก ์ปดํ์ผํ๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 1500 / ์ ์ ์์ค 100 ์ด์
- ๋๋ฌด ์๊ฒ ์ค์ ํ๋ฉด ์ปดํ์ผ ์๊ฐ ์ฆ๊ฐ
- https://www.javacodegeeks.com/2012/10/warming-up-your-jvm-superfast.html
Reference
- https://kwonnam.pe.kr/wiki/java/memory
- https://kwonnam.pe.kr/wiki/java/performance
- https://kwonnam.pe.kr/wiki/linux/performance
- Elastic Search Memory Setting ๊ฐ์ด๋๋ผ์ธ
- https://brunch.co.kr/@alden/35
- https://www.baeldung.com/jvm-parameters
- https://www.slipp.net/wiki/pages/viewpage.action?pageId=26641949
- https://d2.naver.com/helloworld/184615