يُعتقد عمومًا أن الأشياء الجديدة يتم تخصيصها جميعًا على الكومة ، لكن هذا غير صحيح تمامًا. من خلال تحليل عملية تخصيص كائن Java ، وجدنا أنه بالإضافة إلى تخصيصه على الكومة ، يمكن للكائنات أيضًا تخصيص مساحة في المكدس أو TLAB. الأساس الفني لتخصيص الكائنات على المكدس هو تحليل الهروب واستبدال العددية. هذه المقالة تقدم بشكل أساسي تحليل الهروب.
تعريف تحليل الهروب
تحليل الهروب هو خوارزمية تحليل تدفق البيانات العالمية متعددة الوظائف يمكن أن تقلل بشكل فعال من الضغط المتزامن وضغط تخصيص كومة الذاكرة في برامج JAVA.
من خلال تحليل Escape ، يمكن لمترجم Java Hotspot تحليل نطاق استخدام مرجع كائن جديد وتحديد ما إذا كان سيتم تخصيص الكائن إلى الكومة.
تدعم Java وتمكين خيارات تحليل الهروب في Java SE 6U23 والإصدارات الأحدث. يمكن لمترجم Java's Hotspot JIT إجراء تحليل للهروب من الكود عندما يتم تحميل الطريقة أو تحميلها ديناميكيًا.
السلوك الأساسي لتحليل الهروب هو تحليل النطاق الديناميكي لكائن ما: عندما يتم تعريف كائن في طريقة ما ، يمكن الرجوع إليه بطريقة خارجية.
الطريقة الهروب: على سبيل المثال ، تمرير كمعلمة استدعاء إلى طرق أخرى.
هروب مؤشر الترابط: قد يتم الوصول إليه بواسطة مؤشرات ترابط خارجية ، مثل تعيين القيم لمتغيرات الفئة أو متغيرات المثيل التي يمكن الوصول إليها في مؤشرات الترابط الأخرى.
الأساس النظري لتحليل الهروب
يتم إجراء تحليل الهروب بناءً على الخوارزمية التي وصفها Jong-Deok Choi و Manish Gupta و Mauricio Seffano و Vugramam C. Sreedhar و Sam Midkiff وآخرون في ورقة "Escape analysis for Java".
تقدم هذه الخوارزمية رسمًا بيانيًا متصلاً ، ويستخدم الرسم البياني المتصاعد لإنشاء العلاقة التي يمكن الوصول إليها بين الكائن ومرجع الكائن ، وعلى أساس هذا ، يتم اقتراح طريقة تحليل تدفق البيانات المدمجة. نظرًا لأن الخوارزمية تعتمد على السياق وحساسة للتيار ، وتحاكي العلاقات المتداخلة في أي مستوى من الكائن ، فإن دقة التحليل عالية ، لكن وقت التشغيل واستهلاك الذاكرة كبير نسبيًا.
تعتمد معظم تطبيقات تحليل الهروب على فرضية "العالم المغلق": جميع الأساليب الممكنة التي يتم تنفيذها معروفة قبل تحليل الهروب ، ولن يغير التشغيل الفعلي للبرنامج علاقة المكالمة بينهما. ولكن عندما يتم تشغيل برنامج Java الحقيقي ، فإن هذه الافتراضات لا تنطبق. العديد من ميزات برامج Java ، مثل تحميل الفئة الديناميكية ، واتصال الوظائف المحلية ، ومكالمات البرامج المتعددة ، ستقوم بإنهاء اتفاقية ما يسمى "العالم المغلق".
عمليات المعالجة بعد تحليل الهروب
بعد تحليل الهروب ، يمكن الحصول على ثلاث حالات هروب محتملة للكائن:
GlobalEScape: أي أن مرجع كائن يهرب من طريقة أو مؤشر ترابط. على سبيل المثال ، يتم نسخ مرجع الكائن إلى متغير فئة ، أو تخزينه في كائن هرب ، أو يتم إرجاع مرجع الكائن إلى طريقة الاتصال كقيمة الإرجاع للطريقة.
Argescape (هروب مستوى المعلمة): أي أن تطبيق الكائن الذي تم تمريره على طريقة أثناء عملية استدعاء الطريقة. يمكن تحديد هذه الحالة من خلال تحليل الكود الثنائي للطريقة التي يتم ضبطها.
noescape: كائن يمكن استبداله بالرقائق. قد لا يتم تخصيص الكائن على كومة تقليدية.
يمكن للمترجم استخدام نتائج تحليل الهروب لتحسين البرنامج:
يصبح كائن تخصيص الكومة كائن تخصيص المكدس: كائن في طريقة ما ، ولا يهرب مرجع الكائن ، لذلك قد يتم تخصيص هذه الطريقة على ذاكرة المكدس وهي شائعة جدًا في ذاكرة الكومة.
التخلص من التزامن: تكلفة مزامنة الخيط مرتفعة للغاية ، وتخفيض عواقب التزامن التزامن والأداء. يمكن أن يحدد تحليل الهروب ما إذا كان يتم الوصول إلى كائن دائمًا بواسطة موضوع واحد فقط. إذا تم الوصول إليه بواسطة مؤشر ترابط واحد فقط ، فيمكن تحويل عملية التزامن للكائن إلى عملية دون حماية المزامنة ، والتي يمكن أن تحسن بشكل كبير من درجة التزامن والأداء.
استبدال المتجهات: طريقة تحليل الهروب إذا وجدت أن بنية تخزين الذاكرة للكائن لا تحتاج إلى تنفيذ بشكل مستمر ، يمكنك حفظ الأجزاء وحتى جميع الكائنات في سجلات وحدة المعالجة المركزية ، والتي يمكن أن تحسن سرعة الوصول بشكل كبير.