نمایش نتایج 1 تا 14 از 14

نام تاپیک: آزاد نشدن رم اشعالی توسط برنامه

  1. #1

    آزاد نشدن رم اشعالی توسط برنامه

    درود خدمت دوستان گلم
    شاید سوالم تکراری باشه اما خب شایدم مشکل خیلیا باشه
    من یک فرم دارم به نام A داخل این فرم یک دکمه هست که فرم B رو با کد زیر نمایش میده
    Intent intent = new Intent(A.this, B.class);
    intent.addFlags(
    Intent.FLAG_ACTIVITY_CLEAR_TOP |
    Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);
    اکتیویتی B یک سری کارا انجام میده که تقریبا 20 مگابایت از رم گوشو اشغال میکنه مشکل اینجاست وقتی اکتیویتی و میبندم و onDestroy() اجرا میشه حافظه آزاد نمیشه.
    لازم به ذکره که اکتیویتی B عکس نداره که bitmap و خالی کنی.
    راهی هست که با بسته شدن اکتیویتی هر منبعی که اشغال شده شده متغیر ها چه توابع و هرچی که رم و اشغال کرده آزاد بشه؟
    داخل تابع onDestroy() از دستوراتی مثل System.gc(); و Runtime.getRuntime().gc() هم استفاده کردم نمیخوام از دستور EXIT استفاده کنم که برنامه از نو اجرا بشه
    لطفا کمک کنید همه دنیا رو گشتم اما به دلیل سواد پایین خودم پیزی دستگیرم نشد
    ممنون

  2. #2

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    بیشتر توضیح بدید ؟؟؟ از چی استفاده کردید که 20 مگ میشه

  3. #3

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    ارتباط با سروره
    چیز خاصی نداره، اونم با کلاس از نوع انسی
    اینش مهم نیست حتی فرم خالی هم که نشون میدم و مثلا 2 مگ حافظه میگیره وقتی میبندم همون 2 مگ هم آزاد نمیشه!!
    مگه وقتی finish میزنی نباید رم اشغال شده آزاد بشه؟ اما ظاهرا نمیشه داخل نت هم خیلی گشتم و همه میگن آزاد نمیشه اما راه حلی هم ندادن!! همه میگن system.gc بزنید!اما بازم نمیشه، خود گوگل هم گفته با زدن system.gc امکان داره تاثیری رخ نده!!
    کدی یا روشی چیزی نیست؟؟
    وقتی فرم اصلی مثلا 10 مگ میگیره و فرم دوم مثلا 5 مگ میشه 15 تا اما وقتی فرم 2 بسته میشه حافظه اشغالی مثلا 14 میشه!!!هیچ وقت دیگه 10 یا حتی 11 هم نمیشه گاهی اوقات هم.م 15 میمونه!!!
    کمککککک بدیننن لطفاااا

  4. #4

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    نقل قول نوشته شده توسط hamed9090 مشاهده تاپیک
    بیشتر توضیح بدید ؟؟؟ از چی استفاده کردید که 20 مگ میشه
    ارتباط با سروره
    چیز خاصی نداره، اونم با کلاس از نوع انسی
    اینش مهم نیست حتی فرم خالی هم که نشون میدم و مثلا 2 مگ حافظه میگیره وقتی میبندم همون 2 مگ هم آزاد نمیشه!!
    مگه وقتی finish میزنی نباید رم اشغال شده آزاد بشه؟ اما ظاهرا نمیشه داخل نت هم خیلی گشتم و همه میگن آزاد نمیشه اما راه حلی هم ندادن!! همه میگن system.gc بزنید!اما بازم نمیشه، خود گوگل هم گفته با زدن system.gc امکان داره تاثیری رخ نده!!
    کدی یا روشی چیزی نیست؟؟
    وقتی فرم اصلی مثلا 10 مگ میگیره و فرم دوم مثلا 5 مگ میشه 15 تا اما وقتی فرم 2 بسته میشه حافظه اشغالی مثلا 14 میشه!!!هیچ وقت دیگه 10 یا حتی 11 هم نمیشه گاهی اوقات هم.م 15 میمونه!!!
    کمککککک بدیننن لطفاااا

  5. #5

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    اول از همه لازمه که بگم جاوا به طور پیشفرض مدیریت خودکار حافظه داره.و این یکی از قابلیتهای خاص جاوا نسبت به زبانهای دیگه مثل سی پلاس پلاس هست..
    و اگه کار کرده باشین دیدین که تو سی پلاس پلاس وقتی یه شی میساختیم در نهایت خودمون شی رو از بین میبردیم یا همون از حافظه خارج میکردیم...
    و اینجور که من تو چند منبع معتبر جاوا خوندم میاد این چیزا رو تو حافظه نگهداری میکنه مانند پشته که اگه مجدد از به آنها نیاز شد راحت تر باشه دسترسی و سرعت و نوعی کش میکنه و هرگاه که حافظه رم کم بشه خودش به طور اتوماتیک به ترتیب پشته رم رو آزاد میکنه و دلیل ماندن در رم هم همین هست....
    امیدوارم متوجه شده باشید...

  6. #6

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    نقل قول نوشته شده توسط amirxbest مشاهده تاپیک
    اول از همه لازمه که بگم جاوا به طور پیشفرض مدیریت خودکار حافظه داره.و این یکی از قابلیتهای خاص جاوا نسبت به زبانهای دیگه مثل سی پلاس پلاس هست..
    و اگه کار کرده باشین دیدین که تو سی پلاس پلاس وقتی یه شی میساختیم در نهایت خودمون شی رو از بین میبردیم یا همون از حافظه خارج میکردیم...
    و اینجور که من تو چند منبع معتبر جاوا خوندم میاد این چیزا رو تو حافظه نگهداری میکنه مانند پشته که اگه مجدد از به آنها نیاز شد راحت تر باشه دسترسی و سرعت و نوعی کش میکنه و هرگاه که حافظه رم کم بشه خودش به طور اتوماتیک به ترتیب پشته رم رو آزاد میکنه و دلیل ماندن در رم هم همین هست....
    امیدوارم متوجه شده باشید...

    اره من با سی هم کار کردم
    متوجه منظورت شدم که در پشته قرار میده اما نمیخوام در پشته قرار بگیره و پاک بشه
    آیا راهی هست که بتونم پشته رو خالی کنم؟
    سپاس که پاسخ دادید

  7. #7

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    من یه اکتیویتی جدید درست کردم که یه عکس رو نشون بده عکسم با کد ست میکنم با کد زیر
    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image);
    img_image.setImageBitmap(bmp);

    بعد داخل تابع onDestroy() از کدهای زیر استفاده کردم
    ((BitmapDrawable)img_image.getDrawable()).getBitma p().recycle();
    img_image.setImageDrawable(null);
    bmp.recycle();
    System.gc();
    System.gc();

    اما بازم رم آزاد نشد!!!
    کسی نیست به منه بی سواد کمک کنه؟

  8. #8

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    Android keeps processes around in case the user wants to restart the app, this makes the startup phase faster. The process will not be doing anything and if memory needs to be reclaimed, the process will be killed. Don't worry about it :)

  9. #9

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    دوست عزیز طبق گفته هایی که گفتم تو اکثر سایتهای خارجی هم همینو تایید کردن.
    و اینجام تو stakoverflow هم بحث شده به و گفته خود اندروید مدیریت میکنه و نگران نباشید... و برای این تو حافظه میمونه که اگه مجدد خواستین سرعت بیشتری باشه و نیاز به واکشی نباشه...
    و تاکید شما بی دلیل هست فکر میکنم

  10. #10

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    نقل قول نوشته شده توسط amirxbest مشاهده تاپیک
    دوست عزیز طبق گفته هایی که گفتم تو اکثر سایتهای خارجی هم همینو تایید کردن.
    و اینجام تو stakoverflow هم بحث شده به و گفته خود اندروید مدیریت میکنه و نگران نباشید... و برای این تو حافظه میمونه که اگه مجدد خواستین سرعت بیشتری باشه و نیاز به واکشی نباشه...
    و تاکید شما بی دلیل هست فکر میکنم
    چون هربار اکتیویتی دوم رو ران میکنم 1 مگ 1 مگ به رم اضافه میشه!!
    بعد مثلا 20 بار باز و بسته شدن اکتیویتی دوم در نهایت وقتی برمیگردی به اکتیویتی اول 40 مگ رم اشغال شده!!درصورتی که باید مثلا 2 یا 3 مگ باشه

  11. #11

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    نقل قول نوشته شده توسط amirxbest مشاهده تاپیک
    دوست عزیز طبق گفته هایی که گفتم تو اکثر سایتهای خارجی هم همینو تایید کردن.
    و اینجام تو stakoverflow هم بحث شده به و گفته خود اندروید مدیریت میکنه و نگران نباشید... و برای این تو حافظه میمونه که اگه مجدد خواستین سرعت بیشتری باشه و نیاز به واکشی نباشه...
    و تاکید شما بی دلیل هست فکر میکنم
    آخه میخوام دخل اکتیویتی دوم یه آدابتر باشه که 2 تا دکمه داره دکمه اول مثلا 2000 تا عکس وانت رو پشت هم نشون بده خب این 2000 تا داخل رم میمونه بعد که اکتیویتی رو ببندیم و دوباره اجرا کنیم و این بار روی دکمه دوم بزنیم 2000 تا عکس سواری نسون بده خب نمیخوام اون 2000 تاوانت داخل رم بمونه میخوام وقتی دکمه اول رو زد و 2000 تا وانت و نشون داد بعد که اکتیویتی و بست این 2000 تا وانت از رم پاک بشه و دفعه بعدی که وارد اکتیویتی دوم شد و روی دکمه دوم زد 2000 سواری داخل رم بره
    آیا راهی هست که خود آدابتر این کار رو بکنه؟؟آدابترم یک imageview فقط داره که عکسا رو دونه دونه نشون میده
    برای اینه اسرار دارم وقتی یک عکس و نشون دادم و اکتیویتی و بستم عکسی که باز شده بسته بشه
    سپاس گذارم که پاسخ میدی دوست گلم

  12. #12

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    آدابتر روی getView آیتم ها رو میاره داخل رم پس عملا 2000 تا آیتم داخل رم نخواهد بود خیالتون راحت باشه.
    در مورد پر شدن رم هم ,سیستم عامل به صورت خودکار این قضیه رو هندل میکنه,شما 10 تا اکتیویتی با مصرف رم بالا درست کن , بینشون حرکت کن میبینی که بعد از مثلا پر شدن 60 مگابایت یدفعه 10 مگابایت خالی میشه.چون سیستم gc خودش مدیریت میکنه.مگر اینکه انقدر بد کد بنویسید و مرتب از مقادیر public static و ... استفاده کنید که در اون صورت کلا هیچ راه حلی نمیتونه جلوی کرش برنامه رو بگیره.

  13. #13

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    نقل قول نوشته شده توسط Rezaguitar مشاهده تاپیک
    آدابتر روی getView آیتم ها رو میاره داخل رم پس عملا 2000 تا آیتم داخل رم نخواهد بود خیالتون راحت باشه.
    در مورد پر شدن رم هم ,سیستم عامل به صورت خودکار این قضیه رو هندل میکنه,شما 10 تا اکتیویتی با مصرف رم بالا درست کن , بینشون حرکت کن میبینی که بعد از مثلا پر شدن 60 مگابایت یدفعه 10 مگابایت خالی میشه.چون سیستم gc خودش مدیریت میکنه.مگر اینکه انقدر بد کد بنویسید و مرتب از مقادیر public static و ... استفاده کنید که در اون صورت کلا هیچ راه حلی نمیتونه جلوی کرش برنامه رو بگیره.
    ممنونم از پاسخ گوییت دوست عزیز

  14. #14

    نقل قول: آزاد نشدن رم اشعالی توسط برنامه

    سلام
    پیشنهاد میکنم مقاله زیر را که درباره نشت حافظه در اندروید است را مطالعه کنید.

    http://androidgate.ir/165/fixing-mem...ofmemoryerror/

تاپیک های مشابه

  1. سوال: مشکل آزاد نشدن رم در هنگام استفاده از background worker
    نوشته شده توسط papeli_83 در بخش VB.NET
    پاسخ: 1
    آخرین پست: سه شنبه 05 شهریور 1392, 19:57 عصر
  2. سوال: مشکل آزاد نشدن رم در هنگام استفاده از background worker
    نوشته شده توسط papeli_83 در بخش C#‎‎
    پاسخ: 9
    آخرین پست: جمعه 01 شهریور 1392, 15:53 عصر
  3. آموزش:کم کردن حجم برنامه در رم و آزاد کردن رم
    نوشته شده توسط shahrdar در بخش WPF
    پاسخ: 2
    آخرین پست: یک شنبه 27 دی 1388, 23:58 عصر
  4. سوال: ذخیره سازی دسکتاپ توسط برنامه مقیم رم
    نوشته شده توسط frezarad در بخش C#‎‎
    پاسخ: 2
    آخرین پست: دوشنبه 05 مرداد 1388, 15:40 عصر
  5. حافظه اشغالی رم توسط برنامه خود رو به طور چشمگیر پایین بیارید .
    نوشته شده توسط iranianprogrammers در بخش برنامه نویسی در Delphi
    پاسخ: 6
    آخرین پست: شنبه 04 اسفند 1386, 12:09 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •