محتويات الدورة

Java / المتقدم / الدرس 16

التحليل وجمع القمامة واحتجاز الذاكرة

حلل الأداء بأحمال متكافئة وأدلة تشغيل وميّز التخصيص والبيانات الحية المحتجزة وحد الكومة والذاكرة الأصلية ومفاضلات الجامع.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تحديد فرضية أداء ومقاييس مفيدة.
  • شرح بقاء الكائنات القابلة للوصول.
  • استخدام أدلة JFR والجامع دون نتائج مختلقة.

افصل التأخر والإنتاجية وكلفة الموارد

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

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

افهم لماذا لا ينسى الجامع مخبأ حياً

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

يزيل المثال مدخلاً مصطنعاً من خريطة مملوكة ويطبع حجمها. يشرح إسقاط مرجعها لا استرداداً فورياً أو نقصاً مقاساً بالكومة. قد تبقى مراجع أخرى. لا تستخدم System.gc كتأكيد جمع كائن قبل السطر التالي.

java إزالة مرجع مملوك دون ادعاء وقت الجمع
public class Main {

 public static void main(String[] args) throws Exception {
var cache=new java.util.HashMap<String,byte[]>();
cache.put("sample",new byte[16]);
System.out.println(cache.size());
cache.remove("sample");
System.out.println(cache.size());
 }
}
الناتج المتوقع
1
0

تفقد الخريطة مدخلها دون ادعاء استرداد فوري أو حجم كومة أو عدد جمع.

قيّد الاحتجاز بسياسة ظاهرة

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

يحفظ LinkedHashMap المرتب بالوصول مدخلين ويزيل الأقدم عند الثالث. هو توضيح أحادي الخيط لا مكتبة مخبأ إنتاج متزامنة. تكون المفاتيح b وc لأن a الأقدم ولم تغير قراءة الترتيب. يحتاج الفعلي تزامناً وحساب حجم وفشلاً وعمراً.

java سياسة احتجاز محدودة أحادية الخيط
public class Main {

 public static void main(String[] args) throws Exception {
var cache=new java.util.LinkedHashMap<String,Integer>(4,0.75f,true) {
 protected boolean removeEldestEntry(java.util.Map.Entry<String,Integer> e) { return size()>2; }
};
cache.put("a",1);cache.put("b",2);cache.put("c",3);
System.out.println(cache.keySet());
 }
}
الناتج المتوقع
[b, c]

يتجاوز إدخال c الحد فيزال a الأقدم، ولا يجعل ذلك الخريطة آمنة للخيوط.

اربط JFR وسجل الجامع والكائنات المحتجزة

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

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

غير فرضية مدعومة وتحقق

إن نمت البيانات الحية مع مفاتيح مستخدم فريدة فافحص الاحتجاز قبل Xmx. وإن ارتفع التخصيص وبقي الحي محدوداً فافحص المواقع وكلفة الجمع. وإن انتظر العمال إدخالاً فقد لا يفيد تحسين حساب صغير. قارن فترات متكافئة واحتفظ بالرجوع.

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

الأخطاء الشائعة وإصلاحها

OutOfMemoryError despite garbage collection

لماذا يحدث؟
تتجاوز البيانات الحية أو ميزانية أخرى السعة.
كيف تصلحه؟
حدد مسار الاحتجاز ونوع المورد قبل الحدود.
كيف تتجنب تكراره؟
قيّد المخازن والطوابير والقبول والإدخال.

A single stopwatch run suggested a huge speedup

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

A heap dump was shared publicly

لماذا يحدث؟
اعتُبر أثر التشخيص بيانات بريئة.
كيف تصلحه؟
قيّد الدليل ونقحه وفق الحادثة.
كيف تتجنب تكراره؟
صنف التفريغ والتسجيل كمحتوى حساس محتمل.

اختبر فهمك

1. تحتفظ خريطة ساكنة بكل طلب. لماذا لا يحل الجامع؟

اعرض الحل المشروح

تبقى الخريطة حية فتحتجز القيم ولا يستنتج الجامع انتهاء الحاجة. ضع عمراً محدوداً وأزل المراجع ثم تحقق من اتجاه الحي بحمل ممثل.

2. تستقر الكومة وتنمو ذاكرة العملية. ماذا تفحص؟

اعرض الحل المشروح

افحص الذاكرة الأصلية والمخازن المباشرة ومكدسات الخيوط وذاكرة الشيفرة وتعريف القياس. لا تفترض أن Xmx يتحكم في الكل واربط النمو بالأحداث والموارد.

أهم ما تعلمته

  • تحدد قابلية الوصول الاحتجاز لا فائدة العمل.
  • تختلف الكومة والتخصيص وذاكرة العملية.
  • تحتاج نتائج الأداء أدلة حمل مضبوطة.

المراجع الرسمية