سؤال

وأنا أعلم أن المتغيرات ومعلمتين من الطرق المحلية تعيش في كومة، لكنني لم أتمكن من معرفة أين يعيش فعلا الأساليب في حالة جافا؟

إذا أعلن أي كائن الموضوع مثل:

Thread t=new Thread();
t.start();

وهكذا وهذا يعني أنني قمت بإنشاء الدعوة منفصل أساليب بصرف النظر عن الأسلوب الرئيسي. ماذا يعني؟ يعني الدعوة لتسلسل منفصل طرق على الذاكرة المكدس؟ هل أنا على حق؟

هل كانت مفيدة؟

المحلول

ويخصص لكل موضوع كومة الخاص بها.

هذه المقالة لديه مقدمة جيدة لفصل الذاكرة ضمن عملية جافا.

<اقتباس فقرة>   

داخل آلة جافا الافتراضية، كل   وتمنح موضوع كومة جاوة، التي   يحتوي على بيانات لا يمكن ترابط آخر   الوصول، بما في ذلك المتغيرات المحلية،   المعلمات، والقيم عودة كل   طريقة قد استندت إلى الموضوع. ال   البيانات على كومة يقتصر على   أنواع ومراجع الكائنات بدائية.   في JVM، فمن غير الممكن   وضع صورة لكائن الفعلي على   المدخنة. كافة الكائنات الموجودة على   الكومة.

ولقد شاهدت العديد من السيناريوهات حيث عملاء تنفيذ خوادم مترابطة بشكل كبير على أساس أن كل موضوع لا القليل جدا، وأنها واجهت مشاكل في الذاكرة. ذلك لأن يخصص لكل موضوع كومة الخاصة به، وهذا (من الواضح) يصل. I <م> التفكير القيمة الافتراضية هي 512K في الموضوع، ولكني لا يمكن العثور على مصدر قانوني لذلك.

نصائح أخرى

إذا كنت أتذكر بشكل صحيح، سوف رمز الأسلوب نفسه يعيش في الجزء مدونة الذاكرة، في حين أن المتغيرات أعلن داخليا سيعيشون في المكدس، وسيتم إنشاء الكائنات على الكومة. في جاوة، مؤشرات متغيرة والأوليات يعيش على المكدس، في حين يعيش أي الكائنات التي تم إنشاؤها في كومة.

لو(الفقراء) تمثيل ASCII:

-------
|STACK|
-------
|FREE |
-------
|HEAP |
-------
|CODE |
-------

وأين يمثل كومة كومة، وحرية يمثل ذاكرة حرة وهيب يمثل كومة، ويمثل CODE مساحة التعليمات البرمجية.

وهذا ما تقول ذاكرتي - بعض التفاصيل قد يكون من الخطأ

ويتكون كومة من الدعاء الأسلوب. ما جافا يدفع إلى المكدس هو سجل الاحتجاج الطريقة، التي تلخص جميع المتغيرات (سواء المعلمات والمتغيرات مثيل محليا) لهذا الأسلوب. عند بدء تشغيل أحد تطبيقات Java، الأسلوب الرئيسي (والذي يتضمن تلقائيا المعلمة وسائط) هو الشيء الوحيد على المكدس:

main(args)

وعندما يقول لك إنشاء كائن فو، وندعو foo.method ()، المكدس تبدو الآن مثل:

method()
main(args)

وكما تحصل على أساليب ودعا، ودفعهم إلى المكدس، وبعد عودتهم، تتم إزالتها أو "برزت" من المكدس. كما يتم تعريف المتغيرات واستخدمت دخول المكدس، والتي تتطابق مع الطريقة الحالية (في الجزء العلوي من كومة)، وينمو ليشمل حجم المتغير.

وعلى سبيل المثال مع المواضيع، وسيكون لكل موضوع يكون كومة الخاصة به والتي وجدت مستقلة عن كومة كل موضوع الآخر.

ومكدس يحتوي على كافة المتغيرات المحلية وجميع الدعاء طريقة نشطة. كومة عقد كل شيء آخر.

وأما عن السؤال الفرعي الخاص بك: فهذا يعني يتم إنشاء كومة جديد مع ذاكرة مخصصة الخاصة بها. بينما موضوع جديد الخاص بك وسوف تشترك في الفضاء كومة الإجمالي (الذاكرة) التي خصصتها JVM

ويتم تقسيم كومة يصل إلى أجيال متعددة.

ووبايت كود، ويعيش corrosponding JIT ترجمة التعليمات البرمجية آلة في ما يسمى الجيل دائمة، جنبا إلى جنب مع سلاسل داخليا والبيانات فئة أخرى.

وعلى الرغم من أن يطلق عليه الجيل "دائم"، يمكن أن يكون لا يزال القمامة التي تم جمعها. بعض المكتبات والأطر واللغات JVM تولد بايت كود في وقت التشغيل، وبالتالي فإن الجيل دائمة تحتاج أحيانا تنظيف. تماما مثل أجيال أخرى من كومة، ولكن (عادة تأمل واحدة) أقل كثيرا.

ووبايت كود الفعلي و / أو رمز JIT'd أن يعيش في الذاكرة للعملية. من المحتمل أن يكون هناك نسخة واحدة فقط منه في ذاكرة العملية، وجميع المواضيع في حصة عملية بالنظر إلى أن الذاكرة. أية متغيرات <م> المشتركة من جانب تلك المواضيع سيتم الوصول إليها من قبل وسائل مشتركة. سيتم إنشاء المتغيرات المحلية إلى المواضيع (حتى طريقة المحلي المتغيرات المستخدمة ضمن موضوع) داخل الذاكرة التي الترابط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top