Apa itu Memory Heap?

174

Apa itu tumpukan memori?

H4cKL0rD
sumber

Jawaban:

234

Mungkin yang Anda maksud adalah tumpukan dari sudut pandang alokasi memori, bukan dari sudut pandang struktur data (istilah ini memiliki banyak makna).

Penjelasan yang sangat sederhana adalah bahwa heap adalah bagian dari memori di mana memori yang dialokasikan secara dinamis berada (yaitu memori yang dialokasikan melalui malloc). Memori yang dialokasikan dari heap akan tetap dialokasikan hingga salah satu dari yang berikut terjadi:

  1. Memori adalah free'd
  2. Program berakhir

Jika semua referensi ke memori yang dialokasikan hilang (mis. Anda tidak menyimpan pointer lagi), Anda memiliki apa yang disebut kebocoran memori . Di sinilah memori masih dialokasikan, tetapi Anda tidak memiliki cara mudah untuk mengaksesnya lagi. Memori yang bocor tidak dapat direklamasi untuk alokasi memori yang akan datang, tetapi ketika program berakhir, memori akan dibebaskan oleh sistem operasi.

Bandingkan ini dengan memori tumpukan yang merupakan tempat variabel lokal (yang didefinisikan dalam suatu metode) tinggal. Memori yang dialokasikan pada stack umumnya hanya hidup sampai fungsi kembali (ada beberapa pengecualian untuk ini, misalnya variabel lokal statis).

Anda dapat menemukan informasi lebih lanjut tentang tumpukan di artikel ini .

LeopardSkinPillBoxHat
sumber
3
Bagaimana variabel lokal bisa hidup dalam tumpukan? Tumpukan hanya memungkinkan untuk mengambil satu variabel sekaligus dalam urutan yang sangat spesifik. Bagaimana jika saya memerlukan variabel lokal dari suatu tempat yang lebih rendah di stack?
CodyBugstein
9
@Imray - dalam bahasa yang diketik secara statis, ukuran parameter lokal diketahui pada waktu kompilasi. Oleh karena itu variabel lokal dapat diakses secara langsung dari stack melalui offset alamat. Tidak perlu memunculkan tumpukan untuk melakukan ini. Lihat jawaban ini untuk lebih jelasnya.
LeopardSkinPillBoxHat
17

Memori tumpukan adalah lokasi di memori di mana memori dapat dialokasikan pada akses acak.
Tidak seperti tumpukan di mana memori dialokasikan dan dirilis dalam urutan yang sangat jelas, masing-masing elemen data yang dialokasikan pada heap biasanya dirilis dengan cara yang tidak sinkron satu sama lain. Setiap elemen data tersebut dibebaskan ketika program secara eksplisit melepaskan pointer yang sesuai, dan ini dapat menyebabkan tumpukan terfragmentasi. Sebaliknya hanya data di bagian atas (atau bagian bawah, tergantung pada cara tumpukan bekerja) dapat dirilis, sehingga elemen data dibebaskan dalam urutan terbalik yang dialokasikan.

mjv
sumber
9

Heap hanyalah area di mana memori dialokasikan atau dialokasikan tanpa urutan apa pun. Ini terjadi ketika seseorang membuat objek menggunakan newoperator atau yang serupa. Ini bertentangan dengan tumpukan di mana memori dialokasikan secara pertama keluar terakhir.

fastcodejava
sumber
8

Memori tumpukan adalah struktur umum untuk memegang memori yang dialokasikan secara dinamis. Lihat Dynamic_memory_allocation di wikipedia.

Ada struktur lain, seperti kolam, tumpukan dan tumpukan.

Justicle
sumber
7

Ini adalah sebagian memori yang dialokasikan dari sistem operasi oleh manajer memori yang digunakan oleh suatu proses. Panggilan ke malloc()et alia kemudian mengambil memori dari tumpukan ini daripada harus berurusan dengan sistem operasi secara langsung.

Ignacio Vazquez-Abrams
sumber
7

Anda mungkin berarti tumpukan memori, bukan tumpukan memori.

Memori tumpukan pada dasarnya adalah kumpulan memori yang besar (biasanya per proses) dari mana program yang sedang berjalan dapat meminta potongan. Ini biasanya disebut alokasi dinamis .

Ini berbeda dari Stack, di mana "variabel otomatis" dialokasikan. Jadi, misalnya, ketika Anda mendefinisikan dalam fungsi C variabel pointer, ruang yang cukup untuk menyimpan alamat memori dialokasikan pada stack. Namun, Anda akan sering perlu mengalokasikan ruang secara dinamis (Dengan malloc) di heap dan kemudian memberikan alamat tempat potongan memori ini mulai ke pointer.

Uri
sumber