// // Memory Leak On Release .net Application - Geeks Portal

Memory Leak On Release .net Application

Last post 09-17-2011 9:06 by Agus Syahputra. 5 replies.
Page 1 of 1 (6 items)
Sort Posts: Previous Next
  • 09-16-2011 11:27

    • junifar
    • Top 500 Contributor
    • Joined on 04-13-2009
    • Posts 9
    • Points 150

    Memory Leak On Release .net Application

    Salam smua. Para master, saya mau setiap menampilkan(instance) sebuah form maka memory akan naik, namun apakah ketika kita menutup terus mendisposenya memory pada instance form yang telah di buat akan tersisa ? bagaimana cara me release memory yang terpakai pada instance form tsb. Saya membuat aplikasi mengunakan .net 2010 c# menampilkan form yang ckup banyak namun ketika saya close dan dispose memory tidak turun dengan sewajarnya, hanya bbrp persen. apakah ini merupakan kelemahan visual studio ? Mohon tanggapannya
    • Post Points: 20
  • 09-16-2011 17:17 In reply to

    Re: Memory Leak On Release .net Application

    Pada saat kita men-dispose or close suatu object, bukan berarti kita membebaskan memory yang telah mereka tempati. Tetapi Dispose bertujuan untuk membebaskan Unmanaged Resource yang kita gunakan (ex, Form kita membuka File maka dispose akan melepaskan File tersebut sehingga bisa digunakan oleh object yang lain).


    Bila kita meng-nullkan object Form, maka memory yang di tempati oleh object Form akan dibebaskan. Tapi itu semua menjadi tanggung jawab dari Garbage Collection (pembebasan memory akan dilaksanakan secara otomatis oleh Garbage Collection). So, hanya Garbage Collection yang tau bagaimana dan kapan suatu memory yang ditempati oleh suatu object dibebaskan.

    NB : Yang patut disalahkan disini bukan Visual Studio, karena VS hanyalah IDE seperti Notepad, tetapi lebih canggih. But itulah kekurangan Managed Language (C#, Java). Proses yang berhubungan dengan memory semuanya di handle oleh CLR or JRE. Sehingga hanya CLR dan JRE saja yang berhak melakukan proses pembebasan memory.
    So, kalau mau lebih flexibel bermain dengan memory bisa nyentuh Native Language seperi Unmanaged C++.
    Share what you have, to getting more

    Agus Syahputra
    (Medan, Indonesia)
    • Post Points: 20
  • 09-16-2011 17:41 In reply to

    • junifar
    • Top 500 Contributor
    • Joined on 04-13-2009
    • Posts 9
    • Points 150

    Re: Memory Leak On Release .net Application

    wah, baru tahu saya ternyata dispose bukan membebaskan memory. "Bila kita meng-nullkan object Form, maka memory yang di tempati oleh object Form akan dibebaskan" saya juga mencoba metode ini dengan men-set bbrp object yang di simpan dalam variable (variable image stream) ke null tapi tidak memperlihatkan penurunan memory. " So, hanya Garbage Collector yang tau bagaimana dan kapan suatu memory yang ditempati oleh suatu object di bebaskan" garbage collector saya pernah coba menyimpannya pada fungsi dispose, bisakah kita mengontrol fungsi garbage collector ini ( apakah ada fungsi free memory di dalam garbage collector ?) "NB : Yang patut disalahkan disini bukan Visual Studio. But itulah kekurangan Managed Language (C#, Java). Proses yang berhubungan dengan memory semuanya di handle oleh CLR or JRE. Sehingga hanya CLR dan JRE saja yang berhak melakukan proses pembebasan memory. So, kalau mau lebih flexibel bermain dengan memory bisa nyentuh Native Language seperi Unmanaged C++." dari pernyataan pak agus saya masih belum paham bagaimana CLR (Kapan CLR) aktif membebaskan memory yang tidak terpakai tsb. saya mencoba bbrp demo program .net dari master2 luar ketika proses selesai seketika itu pula memory proses turun drastis. tapi ketika saya cba dengan form sederhana tidak turun malah cenderung mengalami peningkatan bbrp persen dari memory sebelum aksi berjalan. bisakah teman-teman kasih tips bagaimana hal itu bisa terjadi ?
    • Post Points: 20
  • 09-16-2011 22:53 In reply to

    Re: Memory Leak On Release .net Application

    Kalau di unmanaged C++ kita bisa pakai delete keyword.

    Tapi di C# tidak ada cara explicit untuk membebaskan memory.

    Kita bebas menciptakan object di C#. Tapi masalah alokasi dan dealokasi memory merupakan urusan private dari Garbage Collection.

    Kita bisa secara explicit memaksa proses Garbage Collection terjadi dengan memanggil GC.Collect(), tapi tetap tidak terjadi proses pembebasan Memory.

    Pembebasan memory akan dilakukan oleh Garbage Collection secara otomatis menurut algoritma yang sudah ditentukan oleh team pembuat CLR yaitu Microsoft.


    Secara simple Garbage Collection bisa dijelaskan sbg berikut :

    C# atau Java disebut sebagai Managed Language. Karena kita tidak perlu berurusan langsung dengan proses pembebasan memory seperti di C. Semuanya dilaksanakan otomatis oleh CLR di C# atau JRE di Java.
    CLR : Common Language Runtime
    JRE : Java Runtime Environment


    Yang menjadi pertanyaan adalah bagaimanakah CLR melakukan pembebasan memory?


    Singkatnya, CLR punya yang namanya suatu mekanisme Garbage Collection. Yaitu bisa diartikan sebagai proses pengumpulan sampah. Sampah yang dimaksud disini tentu saja object yang sudah tidak diperlukan lagi didalam aplikasi (misalnya, object yang sudah di-null-kan).


    Garbage Collection itu adalah suatu mekanisme yang dilaksanakan dengan algoritma tersendiri untuk melacak state dari object(object masih terpakai atau tidak) dan untuk melakukan penghapusan object.


    Garbage Collection terus berlangsung selama program kita berjalan. Pada saat-saat tertentu Garbage Collection akan melakukan pencatatan state dari suatu object. Dan apabila object tersebut sudah tidak terpakai lagi(misalnya tidak ada variabel yang merujuk kepada object tersebut) maka object ini kemudian akan dianggap sampah dan apabila program memerlukan memory tambahan maka object tersebut akan dihapus dan memory-nya dibebaskan. Yang melaksanakan semua mekanisme ini disebut sebagai Garbage Collector(Istilah lainnya Garbage Collector adalah sebuah bagian dari CLR yang menjalankan mekanisme Garbage Collection).


    Jadi pada C#, object yang di-null-kan tidak langsung dihapus dari memory. Itu semua terserah dari Garbage Collector dan bagaimana Algoritma Garbage Collection itu dilaksanakan.


    So, Kita tidak tau secara pasti kapan suatu object dihapus dari memory, tetapi ada suatu keadaan dimana, ketika object dihapus dari memory dan kita ingin program kita melaksanakan sesuatu. Untuk itu maka C# punya yang namanya Destructor. Destructor di C# tidak lebih dari sebuah method yang akan dipanggil oleh CLR sesaat sebelum object dihapus dari memory. Makanya Destructor di C# namanya harus didahului dengan tanda ~, misalnya ~SomeClass. Tujuannya supaya program kita tidak bisa memanggil Destructor secara langsung. Jadi Destructor di C# bisa dikatakan sangat berbeda dengan destructor di C. Oleh karena itu Destructor di C# disebut juga Finalize Method.

    (dikutip dari netindonesia blog)
    Share what you have, to getting more

    Agus Syahputra
    (Medan, Indonesia)
    Filed under:
    • Post Points: 20
  • 09-17-2011 8:51 In reply to

    • junifar
    • Top 500 Contributor
    • Joined on 04-13-2009
    • Posts 9
    • Points 150

    Re: Memory Leak On Release .net Application

    Terima kasih pencerahannya. saya mendapatkan banyak gambaran mengenai aplikasi c# ini.
    • Post Points: 20
  • 09-17-2011 9:06 In reply to

    Re: Memory Leak On Release .net Application

    Terimakasih kembali
    Share what you have, to getting more

    Agus Syahputra
    (Medan, Indonesia)
    • Post Points: 5
Page 1 of 1 (6 items)