عندما يبدأ الشخص في تعلم لغة Java أو لغات البرمجة الأخرى، فإنه سيتواصل مع الكومة والمكدس، نظرًا لعدم وجود شرح واضح وواضح في البداية، سيكون لدى الكثير من الأشخاص الكثير من الأسئلة حول ما هي الكومة. ما هو المكدس، وما هو الكومة والمكدس؟ والأسوأ من ذلك هو وجود مكدس في Java، وهي بنية بيانات تسلسلية "آخر ما يدخل أولاً يخرج" (آخر ما يدخل أولاً يخرج)، وهي java.util.Stack. وفي هذه الحالة، سيؤدي حتماً إلى جعل الكثير من الناس أكثر حيرة بشأن السؤال السابق. في الواقع، الكومة والمكدس جزءان من الذاكرة ولهما وظائف مختلفة، ويحتاج البرنامج إلى تخصيص الذاكرة في هذه المنطقة. كما نعلم جميعًا، تعمل جميع برامج Java داخل جهاز JVM الظاهري. ما نقدمه هنا هو بطبيعة الحال الكومة والمكدس في ذاكرة JVM (الافتراضية).
الفرق
من الطبيعي أن يكون الفرق بين الكومة والمكدس في Java سؤالاً شائعًا في المقابلات. النقاط التالية هي الاختلافات المحددة.
الجميع يؤدي واجباته
والفرق الرئيسي هو أن ذاكرة المكدس تُستخدم لتخزين المتغيرات المحلية واستدعاءات الأساليب.
يتم استخدام ذاكرة الكومة لتخزين الكائنات في Java. سواء كانت متغيرات الأعضاء، أو المتغيرات المحلية، أو متغيرات الفئة، يتم تخزين الكائنات التي تشير إليها في ذاكرة الكومة.
حصرية أو مشتركة
تنتمي ذاكرة المكدس إلى خيط واحد، وسيكون لكل خيط ذاكرة مكدسة، ويمكن أن تكون المتغيرات التي يخزنها مرئية فقط في الخيط الذي ينتمي إليه، أي أنه يمكن فهم ذاكرة المكدس على أنها الذاكرة الخاصة للخيط.
الكائنات الموجودة في ذاكرة الكومة مرئية لجميع سلاسل الرسائل. يمكن الوصول إلى الكائنات الموجودة في ذاكرة الكومة من خلال كافة سلاسل الرسائل.
خطأ الاستثناء
إذا لم تكن هناك مساحة متاحة في ذاكرة المكدس لتخزين استدعاءات الطريقة والمتغيرات المحلية، فسيقوم JVM بإلقاء java.lang.StackOverFlowError.
وإذا لم تكن هناك مساحة متاحة في ذاكرة الكومة لتخزين الكائن الذي تم إنشاؤه، فسوف يرمي JVM java.lang.OutOfMemoryError.
حجم المساحة
ذاكرة المكدس أصغر بكثير من ذاكرة الكومة إذا كنت تستخدم التكرار، فسوف تمتلئ المكدس الخاص بك بسرعة. إذا لم يتم تنفيذ التكرار في الوقت المناسب، فمن المحتمل أن تحدث مشكلة StackOverFlowError.
يمكنك ضبط حجم ذاكرة المكدس باستخدام الخيار -Xss. يقوم الخيار -Xms بتعيين حجم البداية للكومة، ويقوم الخيار -Xmx بتعيين الحد الأقصى لحجم الكومة.
هذا هو الفرق بين الكومة والمكدس في Java. إذا فهمت هذه المشكلة جيدًا، فيمكن أن تساعدك في حل مشكلات التطوير، وتحليل ذاكرة الكومة واستخدام الذاكرة المكدسة، وحتى إجراء ضبط الأداء.
عرض القيمة الافتراضية (محدثة)
لعرض القيمة الافتراضية للكومة، استخدم التعليمة البرمجية التالية، حيث يمثل PrimaryHeapSize حجم الكومة الأولية وMaxHeapSize هو الحد الأقصى لقيمة الكومة.
انسخ رمز الكود كما يلي:
13:17 $ java -XX:+PrintFlagsFinal -version |.grep HeapSize
uintx ErgoHeapSizeLimit = 0 {المنتج}
uintx HeapSizePerGCThread = 87241520 {المنتج}
uintx الأوليHeapSize:= 134217728 {المنتج}
uintx LargePageHeapSizeThreshold = 134217728 {المنتج}
uintx MaxHeapSize := 2147483648 {المنتج}
نسخة جافا "1.8.0_25"
بيئة تشغيل Java(TM) SE (الإصدار 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (النسخة 25.25-b02، الوضع المختلط)
تحقق من القيمة الافتراضية للمكدس، حيث يكون ThreadStackSize هو حجم ذاكرة المكدس.
انسخ رمز الكود كما يلي:
13:21 $ java -XX:+PrintFlagsFinal -version |.grep ThreadStackSize
intx CompilerThreadStackSize = 0 {pd المنتج}
إنتكس ThreadStackSize = 1024 {pd المنتج}
إنتكس VMThreadStackSize = 1024 {pd المنتج}
نسخة جافا "1.8.0_25"
بيئة تشغيل Java(TM) SE (الإصدار 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (النسخة 25.25-b02، الوضع المختلط)
معلومات الترجمة
النص الإنجليزي الأصلي: http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.
تم تعديل الترجمة وتنظيمها وحذفها بناء على النص الأصلي. إذا كنت مهتما، يمكنك زيارة النص الأصلي. تم حظر عنوان PS.