تحسين أداء تطبيقات Java: أساليب عملية ونصائح

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

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

ابدأ الدورة

تحسين أداء تطبيقات Java: من النظرية إلى التطبيق



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



1. التحليل وإيجاد الاختناقات



قبل تحسين أي شيء، تحتاج إلى فهم ما الذي يبطئ الأمور بالفعل. غالبًا ما تكون التخمينات البديهية خاطئة — فقد لا تكون الاختناقات في الطريقة التي تبدو بطيئة. لذلك، الخطوة الأولى هي التحليل. استخدم أدوات مثل VisualVM أو JProfiler أو Java Flight Recorder (JFR) المدمجة.



مثال على بدء التحليل عبر JFR من سطر الأوامر:



java -XX:StartFlightRecording=duration=60s,filename=recording.jfr \     -jar my-application.jar


بعد التسجيل، افتح الملف في JDK Mission Control وانظر إلى:

  • ملف تعريف CPU — أي الطرق تستهلك معظم وقت المعالج.
  • الذاكرة — أي الكائنات يتم إنشاؤها بشكل متكرر وتأخذ أكبر مساحة.
  • الخيوط — هل هناك أي أقفال أو انتظارات طويلة.


فقط بعد تحليل البيانات يمكنك البدء في إجراء الإصلاحات. بدون تحليل، فإنك تخاطر بتحسين شيء ليس هو المشكلة.



2. ضبط JVM وجامع القمامة



يمكن أن يوفر التكوين الصحيح للآلة الافتراضية Java (JVM) تحسينًا كبيرًا في الأداء. المعلمات الرئيسية التي تستحق التعديل هي:



  • حجم الكومة — المعلمات -Xms (الحجم الأولي) و -Xmx (الحجم الأقصى). لا تقم بتعيين حجم أولي كبير جدًا إذا كان التطبيق لا يحتاج إلى تلك الكمية من الذاكرة.
  • اختيار جامع القمامة (GC) — التطبيقات الحديثة غالبًا ما تستفيد من G1GC (الافتراضي منذ Java 9) أو ZGC (للأكوام الكبيرة وزمن الوصول المنخفض).


مثال على الإطلاق مع إعدادات محسنة:



java -Xms2g -Xmx4g \     -XX:+UseG1GC \     -XX:MaxGCPauseMillis=200 \     -XX:+ParallelRefProcEnabled \     -jar my-app.jar


انتبه إلى العلامة -XX:MaxGCPauseMillis. إنها تحدد وقت الإيقاف المستهدف لجامع القمامة. إذا كان تطبيقك حساسًا لزمن الوصول، حاول ضبطها على 100-200 مللي ثانية. ومع ذلك، فإن القيمة الصغيرة جدًا يمكن أن تسبب عمليات جمع متكررة وتقليل الإنتاجية.



من المفيد أيضًا تمكين تسجيل GC لمعرفة كيفية أداء الجامع:



-Xlog:gc*:file=gc.log:time,uptime,level,tags


3. تحسين الكود: هياكل البيانات والخوارزميات الفعالة



حتى أفضل ضبط لـ JVM لن يساعد إذا كان الكود مكتوبًا بشكل غير مثالي. إليك بعض التوصيات المحددة مع الأمثلة:



3.1. استخدام المجموعات الصحيحة

لا تستخدم ArrayList إذا كنت بحاجة إلى إدراج عناصر بشكل متكرر في بداية القائمة — فهذا يعطي O(n). من الأفضل استخدام LinkedList أو ArrayDeque. للبحث المستند إلى المفاتيح، استخدم HashMap أو TreeMap، وليس القوائم.



مثال سيء:

List<String> names = new ArrayList<>();for (int i = 0; i < 100000; i++) {    names.add(0, "Name" + i); // O(n) each insertion}


مثال جيد:

List<String> names = new LinkedList<>();for (int i = 0; i < 100000; i++) {    name                

المدونات

توصيات الكتب