JVM داخل رم یک فضا برای بارگذاری داده‌ها در اختیار داره. class loader شی باینری متناظر هر کلاس رو تولید می‌کنه و اونها رو بصورت جداگانه و با اطلاعات زیر به Runtime Data Area می‌‌ده و اون هم توی method area ذخیره می‌کنه.

  • نام کامل FQCN به همراه نام پدر
  • تمام چیزهای مربوط به کلاس (کلاس‌های فرزند، اینترفیس‌ها، اینام‌ها و ...)
  • اطلاعات متد‌ها و متغیر های استاتیک

هر کلاس نماینده‌ای در حافظه Heap داره که به class level information دسترسی داره (نام و نام پدر و توابع و اطلاعات متغیرها و متغیرهای استاتیک). Runtime Data Area از قسمت های زیر تشکیل شده.

  1. Method Area: این فضا بین تمام thread ها مشترک است. دسترسی به داده توابع و پردازش آنها باید به صورت thread safe باشد. این قسمت class level data و متغیر های static را ذخیره می‌کند.
    • Classloader reference
    • Run time constant pool: وقتی JVM به دنبال ادرس دقیق یک تابع یا متغیر است این قسمت استفاده می‌کند.
    • Field data: نام، نوع، modifier و ویژگی‌ها
    • Method data: نام، نوع داده بازگشتی، ورودی ها به ترتیب، modifier و ویژگی‌ها
    • Method code: بایت کد، سایزها، جداول و …
  2. Heap Area: این فضا بین تمام thread ها مشترک است. اطلاعات تمام اشیا و متغیرها و آرایه‌ها را آن ذخیره می‌کنیم. ذخیره داده‌ها در این فضا thread safe نیست. این فضا برای GC بسیار مناسب است.
  3. Stack Area: به ازای هر thread اختصاصی است. در زمانی که یک thread  ساخته می‌شه یک فضای مجزا stack به آن اختصاص داده می‌شه. به ازای هر بار صدا زدن توابع یک Stack Frame ایجاد می‌شه و به بالای stack اضافه میشه (push). هر stack frame رفرنس یک آرایه از متغیر های محلی هستش و سایزش وابسته به متغیرها عوض میشه. frame ها حذف میشن (pop) وقتی توابع به صورت معمولی به پایان میرسن. وقتی خطایی رخ می‌دهد با توجه به دادهای stack آن‌ها را رهگیری می‌کنیم. همچنین این فضا thread safe است چون منابع آن مشترک نیست. بعد از نابودی هر thread فضای stack نابود می‌شه. اندازه فضای stack می‌تواند ثابت یا متغیر باشد. اگه یک thread به فضای بیشتری نیاز داشته باشه خطای StackOverflowError پرتاب می‌کنه و اگه یک thread بخواد یک frame جدید درست کنه و فضای کافی نداشته باشه خطای OutOfMemoryError پرتاب می‌کنه. هر stack frame از سه قسمت تشکیل شده.
    • Local Variable Array: یک آرایه است که ۰ رفرنس کلاسی است که متد در آن است و از ۱ پارامتر هایی که به متد ارسال میشوند شروع میشود و سپس متغیر های محلی در آن قرار دارد.
    • Operand Stack: به عنوان یک فضای کاری در زمان اجراست که اگر نیاز باشد برای انجام عملیات استفاده می‌شود. تمام متد‌ها داده‌ها را بین operand stack و local variable array و دیگر متد‌ها تبادل می‌کنند. اندازه این فضا را در زمان اجرا مشخص می‌شود مگر اینکه در زمان کامپایل تعیین شده باشد.
    • Frame Data: تمام نماد‌های متد و بلاک های catch در این فضا نگهداری می‌شود.
  4. PC Registers: به ازای هر thread اختصاصی است. برای نگهداری آدرس های دستورات در حال اجرا استفاده می‌شود (آدرس حافظه در Method Area). اگه متد به صورت native باشد این فضا به آن اختصاص نمی یابد. بعد از پایان دستور جاری با آدرس دستور بعدی بروز می‌شود.
  5. Native Method Stack: به ازای هر thread اختصاصی است. یک نگاشت مستقیم بین thread جاوا و thread سیستم عامل است و داده های متد های native را نگهداری می‌کند که از JNI استفاده می‌کند. زمانی که یک native thread ساخته و اجرا می‌شه.این فضا بهش اختصاص داده می‌شه و زمانی که thread جاوایی که این متد رو فراخوانی کرده بسته می‌شه این native thread هم بسته می‌شه و تمام حافظه‌ای ک گرفته بودند هم آزاد می‌شه. زمان بندی و ارسال thread ها به CPU بر عهده سیستم عامل هستش.