ما هو تخصيص الذاكرة في جافا؟ كومة الذاكرة

ستساعدك هذه المقالة المستندة إلى 'تخصيص الذاكرة في Java' في الحصول على معرفة مفصلة حول تخصيص الذاكرة جنبًا إلى جنب مع هياكل البيانات Stack و Heap.

تخصيص الذاكرة هي عملية يتم من خلالها تخصيص برامج وخدمات الكمبيوتر ببرامج فعلية أو افتراضية ذاكرة الفراغ. في هذه المقالة ، سنتعرف على تخصيص الذاكرة بتنسيق وسنناقش Stack and Heap Memory.

ما هو Stack Memory؟

تُستخدم ذاكرة Java Stack لتنفيذ سلسلة رسائل. تحتوي على قيم خاصة بالطريقة قصيرة العمر ومراجع لكائنات أخرى في الكومة التي يتم إحالتها من الطريقة.





كيفية استخدام الاستوديو المرئي

كومة يتم الرجوع إلى الذاكرة دائمًا في LIFO (Last-In-First-Out) طلب. عندما يتم استدعاء طريقة ، يتم إنشاء كتلة جديدة في ذاكرة المكدس للطريقة للاحتفاظ بالقيم الأولية المحلية والإشارة إلى الكائنات الأخرى في الطريقة.

بمجرد انتهاء الطريقة ، تصبح الكتلة غير مستخدمة وتصبح متاحة للطريقة التالية.



حجم ذاكرة المكدس أقل بكثير مقارنة بذاكرة الكومة.

الميزات الرئيسية لذاكرة Stack Memory

بصرف النظر عما ناقشناه حتى الآن ، فيما يلي بعض الميزات الأخرى لـ كومة ذاكرة:

  • ينمو ويتقلص عند استدعاء طرق جديدة وإعادتها على التوالي
  • توجد المتغيرات داخل المكدس فقط طالما أن الطريقة التي أنشأتها تعمل
  • انها تلقائيا تخصيصها وإلغاء تخصيصها عندما تنتهي الطريقة من التنفيذ
  • إذا كانت هذه الذاكرة ممتلئة ، رميت جافا java.lang.StackOverFlowError
  • الوصول إلى هذه الذاكرة بسرعة عند مقارنتها بذاكرة الكومة
  • هذه الذاكرة خيط آمن حيث يعمل كل خيط في كومة خاصة به

الطرق في فئة Stack

  • دفع الكائن ( عنصر الكائن ): يدفع عنصرًا في أعلى المكدس.
  • فرقعة الكائن (): يزيل ويعيد العنصر العلوي للمكدس. ان 'EmptyStackException' يتم طرح استثناء إذا استدعينا pop () عندما يكون المكدس الاستدعاء فارغًا.
  • نظرة خاطفة على الكائن (): إرجاع العنصر الموجود أعلى المكدس ، لكن لا يزيله.
  • قيمة منطقية فارغة (): يعود صحيحًا إذا لم يكن هناك شيء أعلى المكدس. عدا ذلك ، ترجع خطأ.
  • بحث int ( عنصر الكائن ): يحدد ما إذا كان الكائن موجودًا في المكدس. إذا تم العثور على العنصر ، فإنه يعيد موضع العنصر من أعلى المكدس. وإلا فإنه يعيد -1.

كود جافا لتنفيذ المكدس

import java.io. * import java.util. * class Test {static void stack_push (Stack stack) {for (int i = 0 i<5 i++){ stack.push(i) } } static void stack_pop(Stack stack){ System.out.println('Pop :') for(int i = 0 i < 5 i++){ Integer y = (Integer) stack.pop() System.out.println(y) } } static void stack_peek(Stack stack){ Integer element = (Integer) stack.peek() System.out.println('Element on stack top : ' + element) } static void stack_search(Stack stack, int element){ Integer pos = (Integer) stack.search(element) if(pos == -1) System.out.println('Element not found') else System.out.println('Element is found at position ' + pos) } public static void main (String[] args){ Stack stack = new Stack() stack_push(stack) stack_pop(stack) stack_push(stack) stack_peek(stack) stack_search(stack, 2) stack_search(stack, 6) } } 

//انتاج



memory-allocation-in-java

الآن ، دعونا ننتقل إلى مساحة الكومة.

مساحة الكومة في جافا

يتم تخصيص الذاكرة أثناء تنفيذ التعليمات التي يكتبها المبرمجون. لاحظ أن كومة الاسم لا علاقة لها ببنية بيانات الكومة. يطلق عليه كومة لأنه كومة من مساحة الذاكرة المتاحة للمبرمجين المخصصة و إلغاء التخصيص. إذا كان المبرمج لا يتعامل مع هذه الذاكرة جيدًا ، فيمكن أن يحدث تسرب للذاكرةيحدث في البرنامج.

الميزات الرئيسية لذاكرة Java Heap

  • بصرف النظر عما ناقشناه حتى الآن ، فيما يلي بعض الميزات الأخرى لمساحة الكومة:
  • يتم الوصول إليه عبر تقنيات إدارة الذاكرة المعقدة التي تشمل جيل الشباب ، قديم أو جيل ثابت و الجيل الدائم
  • إذا كانت مساحة الكومة ممتلئة ، فسيتم طرح Java java.lang.OutOfMemoryError
  • الوصول إلى هذه الذاكرة أبطأ نسبيًا من ذاكرة المكدس
  • هذه الذاكرة ، على عكس المكدس ، لا يتم إلغاء تخصيصها تلقائيًا. يحتاج جامع القمامة لتحرير الأشياء غير المستخدمة وذلك للحفاظ على كفاءة استخدام الذاكرة
  • على عكس المكدس ، فإن الكومة ليست كذلك خيط آمن وتحتاج إلى حراسة من خلال مزامنة الرمز بشكل صحيح

الفرق بين Java Heap Space و Stack Memory

بناءً على التفسيرات المذكورة أعلاه ، يمكننا بسهولة استنتاج الاختلافات التالية بين كومة و كومة ذاكرة.

  • كومة يتم استخدام الذاكرة من قبل جميع أجزاء التطبيق بينما يتم استخدام ذاكرة المكدس بواسطة مؤشر ترابط واحد للتنفيذ.
  • عندما يتم إنشاء كائن ، يتم تخزينه دائمًا في مساحة الكومة وتحتوي ذاكرة المكدس على مرجع له. تحتوي ذاكرة المكدس على ملفات المتغيرات البدائية المحلية و المتغيرات المرجعية للكائنات في مساحة الكومة.
  • يمكن الوصول إلى الكائنات المخزنة في الكومة بشكل عام بينما لا يمكن الوصول إلى ذاكرة المكدس بواسطة سلاسل الرسائل الأخرى.
  • تتم إدارة الذاكرة في المكدس بتنسيق LIFO بطريقة بينما هي أكثر تعقيدًا في ذاكرة الكومة لأنها تُستخدم عالميًا. تنقسم ذاكرة الكومة إلى جيل الشباب ، الجيل القديم إلخ ، مزيد من التفاصيل في Java Garbage Collection.
  • ذاكرة المكدس هي قصير الأمد بينما تبقى ذاكرة الكومة من البداية حتى نهاية تنفيذ التطبيق.
  • يمكننا ان نستخدم -XMX و -XMS خيار JVM لتعريف حجم بدء التشغيل والحد الأقصى لحجم ذاكرة الكومة. يمكننا ان نستخدم -XSS لتحديد حجم ذاكرة المكدس.
  • عند امتلاء ذاكرة المكدس ، يطرح وقت تشغيل Java java.lang.StackOverFlowError بينما إذا كانت ذاكرة الكومة ممتلئة ، فإنها تُلقي java.lang.OutOfMemoryError: مساحة كومة جافاخطأ.
  • حجم ذاكرة المكدس أقل بكثير مقارنة بذاكرة الكومة. بسبب البساطة في تخصيص الذاكرة (LIFO) ، ذاكرة المكدس سريعة جدًا عند مقارنتها بـذاكرة كومة.

رسم بياني للمقارنة

معامل كومة كومة
الأساسي يتم تخصيص الذاكرة في كتلة مجاورةيتم تخصيص الذاكرة بترتيب عشوائي
التخصيص وإلغاء التخصيص تلقائي بواسطة المترجميدوي بواسطة مبرمج
كلفة أقلأكثر
التنفيذ الصعبسهل
وقت الوصول بسرعةأبطأ
القضية الرئيسية نقص في الذاكرةتجزئة الذاكرة
موقع الاختلاف ممتازكاف
المرونة سعر الصرف الثابتتغيير الحجم ممكن

بهذا ، نصل إلى نهاية هذا البرنامج التعليمي 'تخصيص الذاكرة في Java'. آمل أن تكون قد فهمت المفهوم وتنفيذه من خلال بعض الأمثلة في الوقت الفعلي.

الآن بعد أن فهمتتخصيص الذاكرة في Javaالأساسيات من خلال مقال 'تخصيص الذاكرة في Java' هذا راجع ملف من Edureka ، وهي شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250000 متعلم راضٍ منتشرين في جميع أنحاء العالم. تم تصميم دورات تدريب وإصدار شهادات Java J2EE و SOA من Edureka للطلاب والمهنيين الذين يرغبون في أن يصبحوا مطوري Java. تم تصميم الدورة التدريبية لمنحك السبق في برمجة Java وتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد من أطر Java مثل Hibernate & ربيع .

فرز وظيفة c ++

لديك سؤال لنا؟ أذكرها في قسم التعليقات في مدونة 'Memory Allocation in Java' وسنعاود الاتصال بك في أقرب وقت ممكن.