Management Memori Pada Bahasa Pemrograman

Atur Agar Segalanya Berjalan dengan Baik dan Normal

D. Husni Fahri Rizal
The Legend
5 min readJun 8, 2021

--

Apa yang dimaksud dengan memory management ? Mengapa ini begitu penting dalam bahasa pemrograman? Pengaturan penggunaan memori pada software merupakan salah satu syarat agar software berjalan dengan baik, efisien, dan effective. Pada bahasa pemrograman modern, walaupun sudah terdapat secara default pengelolaan memori seperti garbage collection, pengetahuan akan memory management tetaplah penting.

Pengetahuan mengenai pengaturan memori perlu diketahui oleh semua programmer, lebih-lebih untuk para senior programmer. Karena tugas dan tanggung jawabnya, pengetahuan ini sangat penting untuk diketahui dan difahami. Belum dapat disebut senior jika tidak pernah mengetahui dan mengatur penggunaan memori.

Apa itu Memory Management

Pengelolaan memori adalah sebuah proses atau cara untuk mengatur sebuah software dalam mengakses memori komputer. Semakin baik cara dan proses pengaturannya maka software yang dibuat semakin tinggi tingkat kualitas softwarenya. Sayangnya pengetahuan ini terkadang bagi sekelompok programmer merupakan hal yang membingungkan dan terkadang seperti kotak hitam.

Ketika sebuah software berjalan di atas komputer atau lebih tepatnya berjalan pada sebuah CPU maka diperlukan memori untuk menjalankan hal-hal berikut.

  • Memuat bytecode dari porgramnya sendiri untuk dijalankan.
  • Menyimpan data dan struktur data dari dari program yang dijalankan.
  • memuat run time dan semua hal agar program yang dijalankan bisa berjalan dengan lancar.

Terdapat dua lokasi pada memori komputer ketika sebuah program dijalankan. Dua jenis memori ini yaitu Stack dan Heap.

Stack Memory

Stack memory digunakan untuk menyimpan memori statik dan berada dalam Random Access Memory (RAM). Stack didukung langsung oleh Central Processing Unit (CPU). Cara penyimpanan mengikuti aturan Last In, First Out (LIFO). Sesuai dengan namanya, stack memory dapat kita analogikan seperti tumpukan kartu. Kartu yang paling atas yang akan keluar lebih dahulu.

Diagram stack memory pada RAM

Berikut karakteristik dari stack memory untuk kita fahami lebih detail.

  1. Karena sifatnya yang LIFO maka proses penyimpanan dan pengambilan data menjadi lebih cepat. Kita tidak memerlukan pencarian data. Kita tinggal mengambil data berdasarkan urutan setelah data yang paling atas keluar. Dengan kondisi ini mensyaratkan data yang disimpan pada stack harus terbatas dan static. Ukuran data sudah dapat diketahui ketika proses kompilasi terjadi.
  2. Tempat eksekusi data dari fungsi sebagai stack frame. Setiap frame ini adalah blok ruang tempat data dieksekusi oleh fungsi disimpan.Misalkan, terdapat pendeklarasian variabel baru dalam fungsi maka ia akan didorong untuk disimpan di bagian stack paling atas. Apabila suatu fungsi berakhir atau keluar maka variabel yang didorong tadi akan dihapus. Dengan demikian, pada akhirnya semua variabel yang di kirim ke stack akan terhapus.
  3. Untuk multithread prosess akan memiliki stack per thread.
  4. Pengaturan memori pada stack ini sangat simple dan langsung ditangani oleh OS dari sistem.
  5. Umumnya data yang disimpan pada stack memory merupakan local variable dengan tipe jenis seperti primitive atau konstanta, pointer, dan function frame.
  6. Memiliki batasan ukuran untuk hampir semua bahasa pemrograman
  7. Apabila terjadi error di sini, kita akan mendapatkan error stack overflow.

Heap Memory

Heap memory digunakan untuk keperluan penyimpanan memori yang bersifat dinamis. Heap merupakan pool memori yang digunakan untuk keperluan umum dan berada pada RAM. Tidak seperti stack, heap ini memerlukan pointer untuk mengakses memori yang tersimpan.

Berikut karakteristik dari heap memori untuk kita fahami lebih detail.

  1. Lebih lambat daripada stack memory karena melibatkan proses pencarian data tetapi dapat menampung data lebih banyak.
  2. Data dengan ukuran yang dinamis dapat di simpan di heap.
  3. Karena sifatnya yang dinamis, sehingga permasalahan mengenai manajemen memori sering terjadi di sini. Solusi otomatis memory management sering ditawarkan oleh beberapa bahasa pemrograman.
  4. Tipe data yang umumnya disimpan di heap yaitu variable global, variable referensi seperti object , string , dan struktur data kompleks lainnya.
  5. Apabila terjadi error umumnya adalah error out of memory apabila aplikasi software kita akan menyimpan data ke mempori melebihi alokasi heap yang didefinisikan.

Tidak seperti hardisk, ram memiliki ukuran yang terbatas dan lebih kecil dari kapasitas hardisk. Apabila sebuah program menulis terus menerus pada ram dan tidak ada proses membebaskan data dari memori maka ram akan penuh dan akhirnya mengakibatkan crash aplikasi bahkan bisa crash secara sistem operasi.

Dengan demikian, daripada memberikan informasi dan memberikan tugas pada pengembang untuk proses melepaskan data dari memori secara manual, umumnya bahasa pemrograman menyediakan mekanisme untuk mengatur memori khususnya memory management pada heap.

Garbage Collection (GC)

Garbage collection sesuai dengan namanya adalah management otomatis untuk membersihkan penggunaan memori yang sudah tidak digunakan pada lokasi heap. GC adalah salah satu manajemen memori paling umum dalam bahasa modern dan prosesnya sering berjalan pada interval tertentu dan dengan demikian dapat menyebabkan overhead kecil yang disebut waktu jeda.

JVM(Java/Scala/Groovy/Kotlin) , JavaScript , C# , Golang , OCaml , dan Ruby adalah beberapa bahasa yang menggunakan garbage collection untuk manajemen memori secara default.

https://medium.com/@jyothsnasrinivas/https-medium-com-jyothsnasrinivas-what-is-a-garbage-collector-d0e152110219

Algoritma GC

Agar proses pembersihan data dari memori heap dapat dilakukan dengan optimal maka diperlukan cara atau algoritma. Berikut adalah beberapa algoritma yang biasa digunakan.

  1. Tracing GC (Mark and Sweep). Algoritma yang umum digunakan dalam garbage collection dan secara umum menggunakan dua langkah (two phase algorithm).Fase pertama menandai memori yang di definisikan sebagai “hidup”. Fase kedua adalah membebaskan memori yang ditandai “mati”. Contoh bahasa pemrograman yang menggunakan algoritma ini adalah java, golang, dan javascript.
  2. Reference Counting GC. Algoritma ini bekerja berdasarkan jumlah dari referensi terhadap sebuah data. Jumlah referensi akan bertambah atau berkurang GC akan berhasil atau terjadi jika count reference jumlah nya nol. Algoritma ini tidak terlalu disukai karena tidak dapat menghandle referensi siklik. Contoh bahasa pemrograman yang menggunakan teknik ini adalah PHP, phyton , dan perl.

Ada kalanya satu bahasa pemrograman tidak hanya menggunakan satu algoritma GC saja. Untuk lebih detail mengenai algoritma GC bisa dibaca di sini. https://en.wikipedia.org/wiki/Garbage_collection_(computer_science). Selanjutnya kita akan membahas pada proses GC yang lebih spesifik dan detail yaitu Memory Management dan GC pada Java.

Reference

--

--

D. Husni Fahri Rizal
The Legend

Engineering Leader | Start-Up Advisor | Agile Coach | Microservices Expert | Professional Trainer | Investor Pemula