[Java] Class์ Alignment
C/C++, Rust ๋ฑ ์ ์์ค์ ์ด๋ฅผ ํ๋ฐฉํ๋ ์ธ์ด์์๋ Alignment๋ผ๋ ๊ฒ์ด ์ ๋ฒ ์ค์ํ ์ฃผ์ ๋ค.
๊ตฌ์กฐ์ฒด์ ํ๋๋ค์ด ์ด๋ป๊ฒ ๋ฐฐ์น๋๋์ง์ ๋ฐ๋ผ์ ์ค์ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๊ธฐ๋ ํ๊ณ , ABI์ ์ํฅ์ ๋ฏธ์น๊ธฐ๋ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
Java์์๋ ์ด๋ฐ๊ฑธ ๊ณ ๋ คํ ์ผ์ด ๋ง์ง ์์ง๋ง, ์ต์ ํ์ ๊ด์ฌ์ด ๋ง๋ค๋ฉด ์์๋ฌ์ ๋์ ๊ฒ์ ์๋ค.
JVM๋ ์ต์ ํ๋ฅผ ์ํด Alignment๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์กฐ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ธฐ๋ณธ Alignment ๋์
์, ์ด๋ ๊ฒ ํด๋์ค๊ฐ ํ๋ ์๋ค๊ณ ํด๋ณด์.
์ด๊ฑด ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ๋ ์ด๋ป๊ฒ ์ฌ๋ผ๊ฐ๊น?
์ผ๋จ String์ class๋๊น 8๋ฐ์ดํธ, int๋ 4๋ฐ์ดํธ, bool์ 1๋ฐ์ดํธ๋ค.
๊ทธ๋ฌ๋ฉด ์ ๊ฑธ ๊ทธ๋๋ก ๋ถ์ฌ์ 13๋ฐ์ดํธ๋ก ์ฌ๋ฆด๊น?
์๋๋ค. ์ค์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์๋ ์์ง๋ง, ์ค์ ๋ก๋ 3๋ฐ์ดํธ ์ ๋๊ฐ ๋ ๋ถ๋๋ค.
๋ด๋ถ์ ์ผ๋ก JVM์ ํด๋์ค์ ๊ฐ๋ค์ 8๋ฐ์ดํธ ๋จ์๋ก ์ฑ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
openjdk์ ๋ ์ด์์ ๋ชจ๋์ ์ฐ๋ฉด ์ค์ ๋ก ์์ฑ๋๋ ํด๋์ค ์ ๋ณด๋ฅผ ๊น๋ณผ ์๋ ์๋ค.

๊ทธ๋ผ ์ด๋ ๊ฒ ๋์จ๋ค. ๋ฐ์ดํธ 3์นธ์ ๋ฃ๋๋ค๋ ๊ฒ์ ํ์คํ ๋ณผ ์ ์๋ค. ํจ๋ฉ ๊ฐญ์ด๋ผ๊ณ ์ฐ์ฌ์๋๊ฒ ํจ๋ฉ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์์๋ฅผ ์ ๋ฉ๋๋ก ๋ฐ๊ฟ ์ ์๋ค. ์ค์ ๊ตฌ์กฐ์ฒด ํ๋์ ๋ค๋ฅด๊ฒ name ํ๋๊ฐ ๋งจ ๋ค๋ก ๋ฐ๋ ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๊ฑด CPU ์์ค์ ์บ์ ์ต์ ํ์ ๋ฐ์ ํ ์ฐ๊ด์ด ์๋ค.
ํ๋์ 64๋นํธ CPU๋ค์ ๊ฐ์ ๋ค๋ฃฐ๋ 8๋ฐ์ดํธ ๋จ์๋ก ๋ค๋ฃจ๋ ๊ฒ์ด ๊ฐ์ฅ ์ต์ ์ ์ฑ๋ฅ์ ๋ธ๋ค.
๋ง์ฝ ํจ๋ฉ์ ์ฑ์ฐ์ง ์๊ณ ์ด์ ์ฉกํ๊ฒ ์๋๋ค๋ฉด, ํ๋ฒ์ ์ฝ์ด์ ์ฒ๋ฆฌํ ๋งํ ๊ฒ๋ ๋ถ๋ฆฌ๋์ฑ๋ก ๋ณ๋ load๋ฅผ ํด์ผํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋๋ฅผ ์ ๋ฉ๋๋ก ๋ค์๋ ๊ฒ๋ ํจ๋ฉ ํฌ๊ธฐ๊ฐ ์ปดํฉํธํ๊ฒ ์ ๋ค์ด๊ฐ๋์ง๋ฅผ ๊ณ ๋ คํด์ ๋ฃ๋๋ค.
๊ทธ๋์ ์ด๋ ๊ฒ ๋ชป์๊ธด ํจ๋ฉ ๊ตฌ์กฐ์ ํด๋์ค๋ฅผ ์ ์ํด๋
์ ๋นํ ๋ฑ๋ฑ ๋ค์ด๋ง๊ฒ ๋ง์ถฐ์ค๋ค.
ํจ๋ฉ ํฌ๊ธฐ ์กฐ์
jvm์ ๊ธฐ๋ณธ ํจ๋ฉ ํฌ๊ธฐ๋ 8์ด๊ณ , ๊ตณ์ด ๋ฐ๊ฟ ์ด์ ๋ ์ ์์ง๋ง, ๋ฐ๊พธ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค.
์ฝ๋ ์์ค์์๋ ์ ์ดํ ์ ์๊ณ , ์คํํ ๋ ObjectAlignmentInBytes๋ผ๋ ํ๋๊ทธ๋ฅผ ์ฃผ๋ฉด ๋๋ค.
-XX:ObjectAlignmentInBytes=16
๊ทธ๋ฆฌ๊ณ ์ด ํด๋์ค๋ฅผ ๋ฃ์ด์ ์กฐ์ฌํด๋ณด๋ฉด

์ด๋ฒ์๋ ํจ๋ฉ์ 15๋ฐ์ดํธ๋ ๋ฃ๋ ๊ธฐ๊ดดํ ์ง์ ํ๋ค.
ํค๋ ๋ฐ์ดํธ 12 + ๋ฐ์ดํฐ 5๋ฐ์ดํธ ํ๋๊น 16 + 1๋ฐ์ดํธ๊ฐ ๋จ์์ ์ฑ์๋ฒ๋ฆฐ ๊ฒ์ด๋ค.
Alignment ํด์
Alignment๋ฅผ ๋นํ์ฑํํ๋ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ์๋ค.
์ ํ์ํ๋ค๋ฉด byte ๋ฐฐ์ด์ ์ํ๋ ์์๋๋ก ๊ฐ์ ์ต์ง๋ก ๊ตฌ๊ฒจ๋ฃ๊ฑฐ๋ ํด์ผ ํ๋ค.
C FFI์ Alignment
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , Alignment๊ฐ ์๋ฐ์ค๋ฝ๊ฒ ๋์ง ์์์ผํ๋ ์ฌ์ฉ์ฌ๋ก๋ ์กด์ฌํ๋ค.
๋ํ์ ์ธ ๊ฒฝ์ฐ๊ฐ C/C++์์ ์ํธ ์ด์ฉ์ฑ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ค ์ธ ๋๋ค.
๋น์ฐํ C๋ ๋ณธ์ธ๋ง์ Alignment ๊ท์น์ ๊ฐ๊ณ ์๊ณ , ์ด๊ฑด ์๋ฐ์ ํธํ๋์ง ์์ ํ๋ฅ ์ด ๋งค์ฐ ๋๋ค.
๊ทธ๋์ FFI์ฉ Struct๋ฅผ ์ฌ์ฉํ ๋๋ C์ Alignment Rule๋ฅผ ๋ฐ๋ฅด๋ ์์ผ๋ก ๋์ํ๊ฒ ๋๋ค.

์ฐธ์กฐ
https://stackoverflow.com/questions/44468639/memory-alignment-of-java-classes
https://www.baeldung.com/java-memory-layout