كيف تجتاز مقابلة Java: أسئلة وأجوبة متقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيف تجتاز مقابلة Java: أهم الأسئلة المتقدمة

\n\n

مقابلة منصب Senior Java Developer ليست مجرد اختبار للصياغة النحوية. يريد المحاورون التأكد من أنك تفهم كيفية عمل JVM من الداخل، وتستطيع تصميم أنظمة متعددة الخيوط، وتعرف تفاصيل جمع القمامة. في هذه المقالة، سنستعرض الأسئلة الأكثر شيوعًا وصعوبة التي ستساعدك على اجتياز المقابلة التقنية بثقة.

\n\n

1. تعدد الخيوط ونموذج الذاكرة في Java (JMM)

\n

هذا من أكثر المواضيع شمولاً. يتحقق المحاورون من فهمك لكيفية تفاعل الخيوط عبر الذاكرة المشتركة، والمشاكل التي قد تنشأ.

\n\n

سؤال: ما الفرق بين volatile و synchronized؟

\n

الإجابة: volatile يضمن رؤية التغييرات لجميع الخيوط، لكنه لا يوفر الذرية. synchronized يضمن الرؤية والذرية (يقفل الشاشة).

\n
// مثال على استخدام volatile\npublic class VolatileExample {\n    private volatile boolean running = true;\n\n    public void stop() {\n        running = false; // التغيير يظهر فورًا للخيوط الأخرى\n    }\n\n    public void run() {\n        while (running) {\n            // تنفيذ العمل\n        }\n    }\n}
\n\n

سؤال: ما هو happens-before في JMM؟

\n

الإجابة: هي علاقة ترتيب جزئي تضمن أن الإجراءات في خيط واحد ستكون مرئية لخيط آخر. على سبيل المثال، الكتابة إلى متغير volatile تنشئ happens-before مع القراءة اللاحقة لهذا المتغير بواسطة خيط آخر. كما يحدث happens-before عند الدخول/الخروج من كتلة synchronized.

\n\n

سؤال: كيف يعمل ConcurrentHashMap؟

\n

الإجابة: في Java 8+، يستخدم ConcurrentHashMap التقسيم على مستوى الجرادل (buckets). بدلاً من قفل الجدول بأكمله، يتم قفل السلة المحددة فقط (عند التصادمات). عمليات القراءة لا تستخدم أقفالًا - بل تستخدم قراءة volatile. عند مستوى عالٍ من التنافس، يمكن إعادة هيكلة الهياكل الداخلية (مثل تحويل القائمة إلى شجرة).

\n
// مثال على ConcurrentHashMap\nConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();\nmap.put("key", 1);\nInteger value = map.get("key"); // بدون قفل للقراءة
\n\n

2. جمع القمامة وتحسين GC

\n

أسئلة حول Garbage Collector (GC) إلزامية لمناصب Senior. يجب أن تعرف ليس فقط أنواع GC، بل أيضًا كيفية ضبطها حسب الحمل.

\n\n

سؤال: ما هي الأنواع الرئيسية لـ GC في HotSpot JVM؟

\n

الإجابة: المجمعات الرئيسية:

\n
    \n
  • Serial GC — أحادي الخيط، للتطبيقات العميلة.
  • \n
  • Parallel GC (Throughput) — متعدد الخيوط، موجه للإنتاجية.
  • \n
  • G1 GC (Garbage First) — الافتراضي منذ Java 9، يقسم الكومة إلى مناطق، يقلل فترات التوقف.
  • \n
  • ZGC و Shenandoah — مجمعات زمن استجابة منخفض مع فترات توقف أقل من 10 مللي ثانية.
  • \n
\n\n

سؤال: ما هي توقف Stop-The-World؟

\n

الإجابة: هي اللحظة التي يتم فيها إيقاف جميع خيوط التطبيق للسماح لـ GC بأداء عمله. فترات STW الطويلة حرجة للأنظمة في الوقت الفعلي. يحاول G1 GC تقليلها عن طريق إجراء الجمع بالتوازي وبشكل تدريجي.

\n\n

سؤال: كيف تكتشف تسرب الذاكرة في Java؟

\n

الإجابة: استخدم أدوات التنميط (VisualVM, JProfiler). راقب نمو heap dump. الأسباب النموذجية للتسرب: المجموعات الثابتة غير المحررة، التنفيذ غير الصحيح لـ equals/hashCode في HashMap، المستمعون الذين لا يتم إلغاء اشتراكهم.

\n
// مثال على تسرب: مجموعة ثابتة\npublic class LeakExample {\n    private static List<byte[]> cache = new ArrayList<>();\n\n    public void addData() {\n        cache.add(new                

المدونات

توصيات الكتب