[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