سؤال

كنت أحاول تنفيذ نوع من التخزين المؤقت المشتركة بين اثنين أو أكثر من JVMs قبل تعيين ذاكرة ملف معين باستخدام MappedByteBuffer.من المواصفات أرى أنه عندما نستخدم MappedByteBuffer.load() يجب تحميل البيانات إلى المخزن المؤقت المباشر.لدي بضعة أسئلة على هذا.

قانون بلدي مقتطف::

RandomAccessFile file = new RandomAccessFile("file.txt","rw");
FileChannel fc = file.getChannel();
MappedByteBuffer buf5 = fc.map(MapMode.READ_WRITE, 0, fc.size());

//ByteBuffer buf6 = ByteBuffer.allocateDirect(100000000);

buf5.load();

try
{
    Class c = Class.forName("java.nio.Bits");
    Field f = c.getDeclaredField("reservedMemory");
    f.setAccessible(true);
    long reservedMemory = f.getLong(null);
    f = c.getDeclaredField("maxMemory");
    f.setAccessible(true);
    System.out.println(
            "Direct Memory Usage: "+ reservedMemory +"/"+ f.getLong(null)+"\n");
}
catch (Throwable t)
{
}
  1. الناتج من رمز أعلاه 0 بايت المباشر استخدام الذاكرة (File.txt 1 GB).ولكن إذا كنت uncomment السطر ..

    ByteBuffer buf6 = ByteBuffer.allocateDirect(100000000);
    

    أحصل على المباشر استخدام الذاكرة من 100MB .غير قادرة على فهم لماذا هذا الأمر, لماذا أنا لا تحصل على أي مباشرة استخدام الذاكرة في المقام الأول ( أيعند خط علق بها )

  2. على الرغم من مباشرة استخدام الذاكرة 0 ب ل رمز أعلاه, أنا لا أرى أن سكان الذاكرة ( باستخدام unix أعلى ) من عملية زيادة قدرها 1 جيجابايت.ولكن إذا كنت تفعل "free-m" على مربع ، أنا لا أرى أي زيادة في استخدام الذاكرة.

في كلتا الحالتين, أنا مشوشة قليلا إلى حيث الذاكرة تنتهي.

وذلك بفضل!

هل كانت مفيدة؟

المحلول

مباشرة ByteBuffers (تلك المخصصة باستخدام ByteBuffer.allocateDirect) تختلف MappedByteBuffers في أنها تمثل أجزاء مختلفة من الذاكرة المخصصة بشكل مختلف.مباشرة ByteBuffers هي وسيلة للوصول إلى كتلة من الذاكرة المخصصة خارج JVM عموما المخصصة مع malloc دعوة (على الرغم من أن معظم تطبيقات المحتمل استخدام فعال لوح مخصص).أولا-هاء.إنه مجرد مؤشر إلى كتلة من الذاكرة.

أ MappedByteBuffer يمثل جزء من الذاكرة المخصصة باستخدام mmap الدعوة التي تستخدم في إجراء تعيين الذاكرة I/O.ولذلك MappedByteBuffers لن تسجيل استخدام الذاكرة في نفس الطريق المباشر ByteBuffer سوف.

وذلك في حين كلاهما "المباشر" في أنها تمثل الذاكرة خارج JVM بهم لأغراض مختلفة.

بوصفها جانبا ، من أجل الحصول على reservedMemory قيمة كنت عاكس الدعوة إلى داخلي طريقة JVM, التي لا يشملها أي مواصفات, ولذلك لا توجد ضمانات ما قيمة العوائد.مباشرة ByteBuffers يمكن تخصيصها من خلال JNI باستخدام NewDirectByteBuffer دعوة من C/C++ (MappedByteBuffers المرجح استخدام هذا) و هذا ربما لا تؤثر على reservedMemory القيمة ، والتي قد غيرت فقط عند استخدام جافا ByteBuffer.allocateDirect.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top