جافا - طريقة سهلة لفحص هيكل كائن متسلسل؟

لدي صف وأرغب في معرفة أي الكائنات الفرعية تحتل أكبر مساحة عندما يتم تسلسل كائن من هذه الفئة. هل هناك أي وسيلة لطيفة/وسيلة للقيام بذلك ، إلا من النظر في الرمز وتحليلها يدويا؟

على سبيل المثال ، أود أن أقول الأداة "العضو يحتل 20٪ ، ب 30٪ ويشغل العضو ج 50٪".

شكر

ملاحظة لقد وجدت بعض الأسئلة ذات الصلة ، ولكن لم أجد الإجابة على سؤالي المحدد هناك.

5
انظر تعليقي على # alexey28 - أنا مهتم ببنية الكائن المتسلسل ، وليس بنية الكائن في الذاكرة
وأضاف المؤلف duduamar, مصدر
لا توجد "كائنات فرعية" في جافا. وهي ليست قضية دلالية. كيف تحسب المشاركة إذا كان لعضوين في كائن عضو مشترك؟
وأضاف المؤلف aalku, مصدر
وأضاف المؤلف npe, مصدر

3 إجابة

الطريقة السريعة نسبياً فقط لحساب حجم الكائن هي كتابة الكائن بالكامل أولاً ، حساب الاستخدام (على سبيل المثال ، الكتابة إلى ByteArrayOutputStream) ثم كتابة كل كائن يشار إليه.

هناك نوعان من هذا لتأخذ في الاعتبار:

  • يقوم ObjectOutputStream ببعض التخزين المؤقت لتتمكن من الإشارة إلى كائن مكتوب سابقًا بمؤشر بسيط. استخدم طريقة reset() لمسح ذاكرة التخزين المؤقت هذه.
  • كل نوع كائن جديد مكتوب ، يحتوي أولاً على وصف الفصل. يعتمد مقدار الحمل على عدد الكائنات من نفس النوع التي تشير إليها.
  • يوجد مقدار حمل (صغير ، 4 بايت) لتهيئة ObjectOutputStream.

للحصول على وصف البروتوكول ، اقرأ هذا الوصف .

1
وأضاف
هذه هي الطريقة التي فكرت في القيام بها ، ما لم أحصل على إجابة أفضل ، سيكون هذا هو الطريق. شكر.
وأضاف المؤلف duduamar, مصدر
1
وأضاف

حسنا ، لم اسمع ابدا عن هذه الاداة. ولكن أعتقد أن هناك علاقة ما بين حجم الكائن في الذاكرة وحجم الكائن المتسلسل. لذا يمكنك تجربة استخدام أداة تعريف الصفحات: VisualVM ، والمضمنة في JDK أو YourKit Profiler .

1
وأضاف
هناك علاقة ما ، لكن ليس تلك العلاقة القوية - يمكن للفصل أن يختار تسلسل بعض الأعضاء ، وتجاهل الآخرين. هذا يمكن أن يغير تماما الصورة ...
وأضاف المؤلف duduamar, مصدر
يتيح الطريق لبعض الإجابات الأخرى. إذا لم يكن أحد يعرف مثل هذه الأداة وتحتاج إلى قياس النسب - عليك أن تكتب بنفسك للقيام بذلك.
وأضاف المؤلف alexey28, مصدر