PDA

View Full Version : سوال: دسترسی به مموری با استفاده از آدرس!



HosseinYazdanfar
یک شنبه 09 اردیبهشت 1397, 12:48 عصر
سلام...
چطور میشه به یک بافر یا استریم آدرس اختصاص داد.
به طور مثال وقتی می‌خوایم از حافظه گوشی بخونیم آدرسش رو داریم .
حالا میخوام آدرسی برای آبجکت های ذخیره سازی داده تو مموری تخصیص بدم‌
دلیلش هم اینه که از یه کتابخونه native داخل یه پروژه استفاده میشه که یه سری دستورات بهش پاس داده میشه ،
هر کدوم ازین دستورات یه input و output میخواد، به عنوان مثال تو پروژه اندرویدی میتونیم آدرس یک فایل رو از حافظه گوشی بدیم . تا اینجای کار مشکلی نیست اما حالا اگه بخوایم فایلی که تو بافر یا ارایه ی بایت ها وجود داره رو بهش بدیم ( بدون ذخیره سازی در حافظه گوشی و خواندن دوباره) به مشکل میخورم!

تا جایی که خوندم نمیشه برای بافر آدرس تخصیص داد.

از طرفی به Direct Byte Buffer ها برخوردم که میشه آدرس تخصیص داد و آدرسشون هم ثابت می مونه .

دوستان کسی نظری ایده ای نداره؟

vahid-p
یک شنبه 09 اردیبهشت 1397, 13:53 عصر
تا جایی که من میدونم، تو جاوا اشاره گر نداریم و نمیتونیم بهش آدرس بدیم و فقط باید آبجکتمون رو جای مشخصی حفظ کنیم و گرنه gc اونو حذف میکنه.
اما مسئله Direct Byte Buffer هم جالب بود و طبق چیزایی که خوندم به نظر نمیاد آدرسی رو بهمون بده و باز همون آبجکت رو داریم که البته یکم متفاوته با آبجکت های دیگه. رفرنس رو ذخیره میکنه ولی محتوا روی heap جاوا نیست و خارج از این محدوده ذخیره میشه. البته نقطه مشخصی از حافظه رو اشغال میکنه و تا آخر برنامه (یا موقعی که بخوایم حذفش کنیم) باقی میمونه. با این حال سرعت بیشتری داره چون تغییر مکان نمیده و پیوسته هست. همچنین حذفش بلافاصله انجام نمیشه و خود به خود توسط gc انجام نمیشه بلکه باید بهش اطلاع بدیم. اگر رفرنسمون رو از دست بدیم، چون نمیتونیم به gc اطلاع بدیم، در نتیجه اون حافظه اشغال میمونه تا آخر برنامه و اصطلاحا بهش نشت حافظه (memory leak) میگن. پس این میشه از معایبش.

این لینک رو هم پیشنهاد میکنم ببینید خوب توضیح داده:
https://www.javamex.com/tutorials/io/nio_buffer_direct.shtml

اما

دلیلش هم اینه که از یه کتابخونه native داخل یه پروژه استفاده میشه که یه سری دستورات بهش پاس داده میشه ،
برای اینکار باید از JNI استفاده کنید که تا حدودی پیچیده است. هر چند لایبرری برای کمک به اینکار به اسم JNA هم ایجاد شده. ببینید: https://github.com/java-native-access/jna