سلام.
من وقتی یه فرم رو میبندم حافظه اشغال شده داخل RAM آزاد نمیشه. چطور باید یه فرم نه کل برنامه رو ببندم تا رم اشغال شده کاملا آزاد شه؟
سلام.
من وقتی یه فرم رو میبندم حافظه اشغال شده داخل RAM آزاد نمیشه. چطور باید یه فرم نه کل برنامه رو ببندم تا رم اشغال شده کاملا آزاد شه؟
منظورتون از اینکه رم اشغال شده کاملا آزاد نمیشه چیه ؟ احتمالا از یک Refrence (مثلا Image ) استفاده میکنید و بعد از بستن فرم ، نمیتونید از ان استفاده کنید. لطفا مشکل رو جزئی تر مطرح کنید. ولی در کل عملیات آزاد سازی اشیاء در Net. توسط GC (Garbage Collection بصورت خودکار انجام می شود.
سلام.
من برای تست یه آرایه از نوع long به طول 10000000 تعریف کردم. وقتی فرم رو میبستم رم همچنان اشغال میموند. من میخوام بالافاصله بعد از بستن فرم رم آزاد شه.
.می تونید از using در هنگام تعریف آرایه استفاده کنید
سلام.
من گفتم آرایه رو برای تست آزاد شدن رم استفاده کردم. مشکل من اصلا آرایه نیست. من میخوام کل فرم بعد از بسته شدن از رم خارج شه نه آرایه.
سلام دوست عزیز.
من زیاد وارد نیستم و اگه درست متوجه شده باشم میخوای بعد از بستن برنامه منابعی که توسط برنامه اشغال شده آزاد بشه. اگه منظورتون اینه فکر میکنم باید از
Application.Exit();
استفاده کنید.
وقتی برنامه بسته بشه، فضای حافظه ایی که ویندوز براش در نظر گرفته بود، آزاد میشه، در نتیجه تمام منابعی که در فضای آدرس اون Process تعریف شده باشند هم آزاد میشند. پس کد شما تاثیری در آزاد کردن منابع process نداره.من زیاد وارد نیستم و اگه درست متوجه شده باشم میخوای بعد از بستن برنامه منابعی که توسط برنامه اشغال شده آزاد بشه.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
فقط در تئوری اینطور هستشولی در کل عملیات آزاد سازی اشیاء در Net. توسط GC (Garbage Collection بصورت خودکار انجام می شود
بعضی از برنامه ها مموری مپد فایل دارن یا هندل های مختلفی دارن که درست بسته نمیشن و بعد از ترمینیت شدن پروسه بازم حافظه رو نگه میدارن قرار نیست که این اتفاق بیفته اما در عمل میبینی که میفتهدر نتیجه تمام منابعی که در فضای آدرس اون Process تعریف شده باشند هم آزاد میشند. پس کد شما تاثیری در آزاد کردن منابع process نداره.
سلام.
خوب چطور میشه حلش کرد؟
من نمیخوام کل برنامه رو ببندم. فقط یه فرم رو میبندم و منابع اون فرم باید آزاد شه.
پس از ایجاد شی ازنوع فرم و نوشتن دستور show بلافاصله دستور myForm.Dispose() را بنویسید.
سلام.
این کار رو هم کرده بودم. dispose هم جواب نمیده.
ممکنه بگی چطور بعد از Dispose کردن کلاس فرمت فهمیدی که فرمت هنوز حافظه رو اشغال کرده؟
سلام.
اینم نمونه مشکل جناب آرژنگ.
راستی شما اولین کسی بودی که تو این سایت به من پیغام خصوصی داد. روز دوم عضو شدنم بود که دیدم پیغام دادی. لینک تایپ فارسی رو داده بودی که تو امضاتم هست.
سلام.
نه این کد مشکلو حل نکرد. بازم رم اشغال میمونه. بعضی مواقع خالی میشه ولی اکثر مواقع نمیشه.
اولا بگید که از کجا می فهمید که رمتون آزاد نمیشه.
دوما روی سیستم من وقتی با VS ران می کنم و در شرایط عادی میبندم رمم آزاد میشه ولی اگر به تعداد زیاد اجرا کنم Exception رخ میده که باعث میشه GC درست کار نکنه! که در این شرایط کافیه هندل کنی Exception رو و در Catch این کدارو بذاری:
GC.Collect();
this.Dispose();
سوما اگه Exe شده برنام رو اجرا کنی بازم مشکلی نداره!
سلام
البته فکرکنم دوستمون از PageFileUsage نگاه میکنه تا حدی حرفش درسته از نظر سیستمی دلیلی ندارم براش ولی موضوع جالبیه ادم به یاده قدیم میافته.اون زمان موظف به ازاد کردن رم بودیم انگار الان هم هستیم.
سلام.
من که تو پست 15 مثال گذاشتم. شما تست کنید. میبینید رم اشغال میمونه. چه از تو خود C# چه فایل exe. فایلی هم که جناب silentrise گذاشتن مشکلو حل نکرد.
این کد رو تست کنید
System.Enviroment.Exit(System.Enviroment.ExistCode );//exit from prossec of exicting code
آن لحظه که تنها اعتبار کسی که مساله ای را مطرح کرده است، شما را در اشتباه بودن ایده هایتان قانع کرد،
آن لحظه،
لحظه وداع شما با دنیای خلاقیت و پیشرفت خواهد بود. . .
برنولی
سلام.
این کد که کل برنامه رو میبنده دوست عزیز.
لطفن این رو برسی کنید.
فکر می کنم بعد از عمل بسته شدن فرم، کل فرم (کلاس) عملن از حافظه خارج شده باشه.
البته امیدوارم من منظور شما رو درست درک کرده باشم.
سلام.
این که همون برنامه ایه که خودم گذاشتم. تغییری توش ندادی.
یک کلاس به شکل زیر بهش اضافه کردم :
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace Test33
{
publicclass FormControl : System.Windows.Forms.Form
{
public FormControl()
{
}
protected override void OnShown(EventArgs e)
{
this.Text = "Form Controler";
}
protected override void OnClosed(EventArgs e)
{
this.Dispose();
}
}
}
و ازش تو فرم دوم به این شکل استفاده کردم :
public partial class Form2 : FormControl
{
privatelong[] a = newlong[10000000];
public Form2()
{
InitializeComponent();
}
}
این کلاس توش نبود؟
با این حالت تا فرم بسته بشه کل کلاس Dispose میشه و دیگه نباید تو حافظه باشه، درسته؟
دوست عزیز اگه دقت کنین PF Usage بیشتر از یه مقدار خاصی دیگه زیاد نمیشه و این نحوه تصمیم گیری GC هست کی چی رو آزاد کنه
در واقع باز هم حافظه داره مدیریت میشه و به نظر نمیاد مشکلی پیش بیاد
قفل مخفی تلگرام، واتس اپ و همه برنامه ها - قفل حرفه ای برای دستگاه اندرویدی شما - با امکان مخفی شدن و جلوگیری از Unisntall شدن
--آموزش ایجاد برنامه های چند زبانه در WPF
-BeRMOoDA File Encrypter-open source-using WPF, C# and MVVM Pattern
-نمونه برنامه ساده و کامل با الگوی MVVM برای کار با دیتابیس با استفاده از Entity Framework در WPF
-WPFMessageBox فارسی/انگلیسی - با قابلیت تغییر Skin
سلام.
نه سار کدت جواب نداد. چرا خودتون کدها رو قبل گذاشتن تست نمیکنید؟ خودتم میتونستی چک کنی ببینی رم آزاد نمیشه.
برمودا من که لنگ این نیستم که رم مدیریت میشه یا نه. برای کار من حتما باید بعد از بسته شدن فرم رم آزاد شه.
سلام
ظاهرا این پیج مطالب مفیدی داره در مورد GC صحبت میکنه فکر کنم به خوندنش بارزه!
باسپاس
این یعنی اینکه با عمل Dispose حافظه آزاد نمیشه، درسته؟
در مورد GC هم مثال خود MSDN خیلی جالبه
http://msdn2.microsoft.com/en-us/library/system.gc.aspx
سلام
دوست عزیز اگه میشه در مورد این مثال MSDN توضیح بدین چون این هم ظاهرا رم رو خالی نمیکند
باسپاس
شما با چه نوع تستس از خارج شدن کلاستون از رم مطلع می شید.
ممکنه کدی قرار بدیدی که حافظه رو قبل از ساخت یک کلاس و بعد از Dispose کردن اون مشخص کنه؟
سلام.
با همون یه آرایه long میشه فهمید دیگه. وقتی رم اشغالی 100 مگ افزایش پیدا میکنه و بعد از بستن فرم و همه اون کارها باز هم رم اشغاله معلومه که آزاد نشده.
ولی چرا دفعه دوم که فرو 2 رو اجرا میکنی باز هم همون 100 مگ میمونه؟ اگه اونجوری که شما میگین باشه باید با هر بار اجرای فرم 2 100 مگ دیگه هم اشغال شه ولی اینطور نمیشه
در واقع GC با تشخیص این موضوع که اون 100 مگ واسه برنامه شما بوده و دیگه احتیاجی نیست بهش جای همونو میده به اون 100 تای جدید.
ظاهرا هم نمیشه کاریش کرد
قفل مخفی تلگرام، واتس اپ و همه برنامه ها - قفل حرفه ای برای دستگاه اندرویدی شما - با امکان مخفی شدن و جلوگیری از Unisntall شدن
--آموزش ایجاد برنامه های چند زبانه در WPF
-BeRMOoDA File Encrypter-open source-using WPF, C# and MVVM Pattern
-نمونه برنامه ساده و کامل با الگوی MVVM برای کار با دیتابیس با استفاده از Entity Framework در WPF
-WPFMessageBox فارسی/انگلیسی - با قابلیت تغییر Skin
این کد مشکل رو حل کرد دوستان
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
GC.Collect();
}
قفل مخفی تلگرام، واتس اپ و همه برنامه ها - قفل حرفه ای برای دستگاه اندرویدی شما - با امکان مخفی شدن و جلوگیری از Unisntall شدن
--آموزش ایجاد برنامه های چند زبانه در WPF
-BeRMOoDA File Encrypter-open source-using WPF, C# and MVVM Pattern
-نمونه برنامه ساده و کامل با الگوی MVVM برای کار با دیتابیس با استفاده از Entity Framework در WPF
-WPFMessageBox فارسی/انگلیسی - با قابلیت تغییر Skin
سلام.
همیشه این جوری نیست که همون 100 مگ رو بده. بعضی اوقات هم 100 مگ جدید میده و 200 مگ افزایش پیدا میکنه.
بعد هم من کاری ندارم دفعه دوم که فرم باز میشه 100 مگ جدید میده یا نه. واسه من مهمه که بعد از بستن فرم رم آزاد شه. حالا شاید اصلا دیگه فرم رو باز نکنم. ولی رم باید آزاد شه. ولی نمیشه.
عجب مشکل عجیبیه ها. یه رم آزاد کردن که باید جز ساده ترین ویژگی های برنامه باشه تو .net 2005 انجام نمیشه.
سلام.
نه من قبلا تست کردم.
GC.Collect(); هم مشکلو حل نمیکنه.
اگه یه بار باز کنی و ببندی بعضی وقتا کار نمیکنه
ولی اگه دفعه دوم که بازش میکنی و میبندی نگاه کنی میبینی کامل آزاد میشه
به نظر من باید تو کلاس GC دنبال جواب باشیم
قفل مخفی تلگرام، واتس اپ و همه برنامه ها - قفل حرفه ای برای دستگاه اندرویدی شما - با امکان مخفی شدن و جلوگیری از Unisntall شدن
--آموزش ایجاد برنامه های چند زبانه در WPF
-BeRMOoDA File Encrypter-open source-using WPF, C# and MVVM Pattern
-نمونه برنامه ساده و کامل با الگوی MVVM برای کار با دیتابیس با استفاده از Entity Framework در WPF
-WPFMessageBox فارسی/انگلیسی - با قابلیت تغییر Skin