سؤال

أنا باستخدام jProfiler للعثور على تسرب الذاكرة في جافا سوينغ التطبيق.لقد حددت حالات JFrame الذي يستمر في النمو في العد.

هذا الإطار هو فتح ثم إغلاق.

باستخدام jProfiler و عرض مسارات GC الجذر هناك مرجع واحد فقط, 'JNI المرجعية العالمية'.

ماذا يعني هذا ؟ لماذا معلقة على كل مثيل من الإطار ؟

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

المحلول

ويكيبيديا لديها نظرة عامة جيدة من جافا واجهة الأصلية, أساسا لأنها تتيح التواصل بين جافا و نظام التشغيل الأصلي المكتبات يكتب في اللغات الأخرى.

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

تحرير هنا قليلا مزيد من المعلومات المحلية مقابلالمراجع العالمية ، لماذا مراجع عالمية تستخدم (وكيف ينبغي أن يتحرر)

نصائح أخرى

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

أ JFrame هو java.awt.Window, و يرتبط مع "الأم" نافذة الكائن.عند الانتهاء تماما مع معين JFrame سبيل المثال ، يجب أن تحتج به dispose() طريقة لتنظيف.

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

كان لي هذه المشكلة بالضبط عند تحديد تسرب الذاكرة في سكريبت التطبيق.في النهاية المشكلة اتضح أنني كنت تشغيل التطبيق في وضع التصحيح وكان عدة نقاط في التعليمات البرمجية.هذا يبدو أنه قد تسبب كائنات 'JNI المرجعية العالمية' ويجري الاحتفاظ بها في الذاكرة دون سبب واضح.عندما التفت قبالة وضع التصحيح كل شيء يعمل كما ينبغي!

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