0Pricing
Java Academy · درس

MemorySegment وArena

تخصيص ذاكرة خارج الكومة

MemorySegment وArena درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

الذاكرة خارج الكومة

تمثّل FFM الذاكرة الأصلية خارج الكومة باستخدام نوعين أساسيين: يمثّل MemorySegment منطقة متصلة من الذاكرة، بينما تتحكم Arena في مدة حياتها.

ويستبدل النوعان معًا الإدارة اليدوية غير الآمنة للمخازن التي كانت شائعة في السابق.

ما هو MemorySegment

يمثل MemorySegment نافذةً ذات نوع على كتلة من الذاكرة. فهو يعرف حجمه ومدة حياته، ويُتحقق من حدود كل عملية وصول إليه.

يمكن أن تكون المقاطع خارج الكومة (أصلية)، أو أن تغلف مصفوفة داخل الكومة.

ما هي Arena

تخصص Arena المقاطع وتحدد وقت تحريرها. وعند إغلاق الـ arena، تصبح جميع مقاطعها غير صالحة في خطوة حتمية واحدة.

  • Arena.ofConfined(): مؤشر ترابط واحد، وإغلاق صريح
  • Arena.ofShared(): الوصول من مؤشرات ترابط متعددة
  • Arena.global(): لا تُحرر مطلقًا
  • Arena.ofAuto(): تُحرر بواسطة GC

تخصيص مقطع

يُعد استخدام Arena مقيّدة ضمن try-with-resources النمط المعتاد. خصص البايتات، واستخدمها، وسيؤدي الإغلاق إلى تحرير كل شيء.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment seg = arena.allocate(16);
            System.out.println("Allocated bytes: " + seg.byteSize());
        }
        System.out.println("Arena closed, memory freed");
    }
}

الكتابة والقراءة

تقرأ وتكتب من خلال أدوات وصول ذات أنواع، تتلقى ValueLayout وإزاحةً. ويضمن ذلك أن يكون الوصول آمنًا من ناحية النوع ومحاذيًا بشكل صحيح.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment seg = arena.allocate(ValueLayout.JAVA_INT);
            seg.set(ValueLayout.JAVA_INT, 0, 42);
            int value = seg.get(ValueLayout.JAVA_INT, 0);
            System.out.println("Stored and read: " + value);
        }
    }
}

تخصيص خانات ذات أنواع

بدلًا من تحديد عدد البايتات الخام، خصص الذاكرة حسب التخطيط. يحجز arena.allocate(JAVA_INT) عددًا كافيًا تمامًا من البايتات المحاذاة بشكل صحيح لقيمة int واحدة.

وهذا يجنبك الحساب اليدوي للأحجام.

مصفوفات القيم

لتخزين عدة عناصر، خصص تخطيط تسلسليًا أو مرّر عددًا. ويستخدم الوصول إلى الفهارس إزاحةً محسوبةً من حجم العنصر.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment ints = arena.allocate(ValueLayout.JAVA_INT, 5);
            for (int i = 0; i < 5; i++) {
                ints.setAtIndex(ValueLayout.JAVA_INT, i, i * 10);
            }
            System.out.println("Element 3: " + ints.getAtIndex(ValueLayout.JAVA_INT, 3));
        }
    }
}

التحقق من الحدود

تؤدي القراءة من مقطع أو الكتابة إليه خارج حدوده إلى طرح IndexOutOfBoundsException. ويؤدي الوصول إلى مقطع بعد إغلاق Arena الخاصة به إلى طرح IllegalStateException.

هذه الفحوص هي ما يجعل ذاكرة FFM آمنة، بخلاف JNI.

التقييد

تربط Arena المقيّدة مقاطعها بمؤشر الترابط الذي أنشأها. ويؤدي وصول مؤشر ترابط آخر إليها إلى طرح WrongThreadException.

بالنسبة إلى الذاكرة المشتركة فعليًا، استخدم Arena.ofShared()، التي تسمح بالوصول من مؤشرات ترابط متعددة بتكلفة بسيطة.

التعامل مع السلاسل النصية

توفر FFM أدوات مساعدة للربط بين سلاسل Java وسلاسل C. تكتب allocateUtf8String (والأحدث: allocateFrom) سلسلةً منتهية بقيمة فارغة، بينما تقرأ getUtf8String واحدةً منها.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment cString = arena.allocateUtf8String("hello");
            System.out.println("Read back: " + cString.getUtf8String(0));
        }
    }
}

اختيار Arena

إرشادات:

  • المخازن قصيرة العمر في مؤشر ترابط واحد: ofConfined()
  • المخازن المشتركة بين مؤشرات الترابط: ofShared()
  • مدة الحياة التي يديرها GC: ofAuto()
  • الثوابت على مستوى العملية: global()

تحقق سريع

تذكّر ما الذي يحدد وقت تحرير الذاكرة الأصلية.

مراجعة

تعلمت كيفية إدارة الذاكرة خارج الكومة:

  • MemorySegment: منطقة ذاكرة يُتحقق من حدودها
  • Arena: تتحكم في مدة الحياة (مقيّدة، ومشتركة، وتلقائية، وعالمية)
  • الوصول ذي الأنواع عبر ValueLayout باستخدام get/set وgetAtIndex
  • الأمان الناتج عن التحقق من الحدود والتقييد

التالي: استدعاء الدوال الأصلية باستخدام مقابض downcall.

الأسئلة الشائعة

هل درس «MemorySegment وArena» مجاني؟

نعم — نص درس «MemorySegment وArena» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «MemorySegment وArena»؟

تخصيص ذاكرة خارج الكومة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «MemorySegment وArena»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. لماذا FFM بدلًا من JNI
  2. MemorySegment وArena
  3. مقابض Downcall
  4. التخطيطات والهياكل
← العودة إلى Java Academy