تفاوت حافظه Heap و Stack در Java
بر اساس تعاریف JVM، هر زمانی که یک ریسمان (Thread) شروع به کار میکنه، حافظهای بهش تخصص داده میشه که که بهش Stack گفته میشه. این حافظه متغیرها محلی و نتایج محلی مربوط به ریسمان رو در خودش نگه میداره. برای تعیین مقادیر این حافظه از کلیدهای Xms و Xmx استفاده میشه. این حافظه در فراخوانی متدها هم مورد استفاده قرار میگیره. هنگامی که ریسمان جدیدی درحال شروع باشه یا محاسبات ریسمانی نیاز به حافظهی بیشتر داشته باشه و حد حافظه این امکان رو نده، خطایی که پرتاب میشه، StackOverflowError هست.
در طرف دیگه هر زمانی که یک JVM شروع به کار میکنه، حافظهای رو در اختیار میگیره که درش اشیاء از روی کلاسهای ساخته میشن. این حافظه بین تمام ریسمانهای JVM مشترکه. برای تنظیم مقادیر این حافظه از کلیدهای XX:PermSize و XX:MaxPermSize استفاده میشه. در صورتی که در هنگام محاسبات نیاز به حافظهی بیشتر از حد مجاز باشه، در صورتی که امکان تخصیص وجود نداشته باشه، خطایی دیده میشه به نام OutOfMemoryError.