জাভাতে Stack এবং Heap মেমরি বলতে কি বুঝায় এই ২ টির মধ্যে পারথক্ক কি?

asked 18 Jan '17, 18:24

Emranul%20haque%20Rakib's gravatar image

Emranul haque Rakib
33916

retagged 19 Jan '17, 08:43

menon's gravatar image

menon
4.7k334


আমরা যেকোনো প্রোগ্রাম লিখলে সেটা জন্য যে মেমরির দরকার হয় সেটা হয় Heap সেকশন থেকে Allocate হবে অথবা Stack সেকশন থেকে Allocate হবে ।

Stack মেমরি কি ?

Stack কাজ করে মূলত FILO [ First In Last Out ] অর্থাৎ যে সবার আগে আসবে সে সবার পরে প্রসেস হবে । ধরুন আমরা ৩ এর ফ্যাক্টরিয়াল বের করতে চাই । সেই কোড টা এই রকম হতে পারে ।

কোড :

int fact(int n)
{
    if( n == 0 || n == 1) {
        return 1;
    }
    return n * fact(n - 1);
}

এই ফাংশনটি যখন ৩ দিয়ে মেইন থেকে কল করবে তখন main() টা Stack এ জমা হয়ে থাকবে এবং fact(3) আবার fact(2) কে কল করবে fact(3) তখন stack এ জমা হয়ে থাকবে । এই ভাবে যতক্ষণ না পর্যন্ত base case এ না যাচ্ছে ততক্ষণ এই ভাবে ফাংশন কলিং চলতে থাকবে । যখন কোন একটা ফাংশনের কাজ একেবারে শেষ হয়ে যাবে তখন সেটা কে stack থেকে বের করে দেয়া হবে ।

কোন একটা ফাংশন যখন stack এ থাকবে সেই মুহূর্তে ঐ ফাংশনের জন্য যে মেমরি দরকার হবে সেটা সেটা সে Stack মেমরি সেকশন থেকে নিবে । যখন ফাংশন টি stack থেকে বের হয়ে যাবে সাথে সাথে ঐ ফাংশনের জন্য ব্যবহিত মেমোরি অটোমেটিক ফাকা হয়ে যাবে ।

এই জন্য আমরা যদি আমাদের রিকারসন ফাংশনের base case না দেই তবে ফাংশনটি চলতেই থাকে এবং যখন আমাদের মেমরির Stack অংশ ফুল হয়ে যায় তখন Stack Overflow এরর দেখায় । এবং আমাদের প্রোগ্রাম টি থেমে যায় ।

Stack থেকে মেমরি Allocate হয় প্রোগ্রামের কম্পাইল টাইম এ । সকল লোকাল ভারিয়েবল যেগুলোর জন্য Dynamicall মেমরি allocate হয় না সেগুলো Stack মেমরি তে থাকবে ।

Heap মেমরি কি ?

আপনি যদি আপনার কোড এর কোন জায়গায় Dynamically মেমরি Allocate করেন তবে সেটা আসবে Heap মেমরি থেকে । যেমন আপনি new ব্যবহার করে কোন অবজেক্ট ক্রিয়েট করেন তবে সেটা Heap এ গিয়ে জমা হবে । Stack যেমন প্রোগ্রামের কাজ শেষ মেমরি অটোমেটিক ক্লিয়ার হয়ে যায় । Heap এ অটোমেটিক হয় না ।

Heap থেকে ডিলিট করতে হলে আপনা কে সেটা ম্যানুয়ালি করে হবে । এই কাজটা করার জন্য Java তে garbage collection নামে এটা বিষয় আছে ।

Heap থেকে মেমরি Allocate হয় প্রোগ্রামের রান টাইম এ ।

ধন্যবাদ :)

permanent link

answered 19 Jan '17, 08:35

menon's gravatar image

menon
4.7k334

edited 23 Jan '17, 16:31

আমরা জানি যে প্রত্যেকটা Object বা Variable গুলো Method এর ভিতরে থাকে। আমরা এটাও জানি যে প্রত্যেকটা Program main() method থেকে যাত্রা শুরু করে যেখানে অনেক গুলো ক্লাস Helper হিসেবে কাজ করে। Interesting এর বিষয় হল প্রত্যেকটা method মানেই একেকটা Thread in java. যেটা JVM কে বলে দেয় যে সে একটা নির্দিষ্ট কাজ করবে। কথা হল যতগুলো Method থাকবে সবই Thread. যেমন MainClass এ যদি দুইটা Method থাকে main() method & print() method তাহলে দুইটাকেই আমরা Thread বলব।

Method এর ভিতর যখন আমরা কোন Object declare করি তখন সেই Object টা Heap Memory তে জমা হয়(String object এর জন্য Heap এ pool create হয়)। আর প্রত্যেকটা Thread(মেথড) এর জন্য Stack Memory তে একেকটা ব্লক তৈরি হয় যেটার লিঙ্ক heap memory থেকে পাবে। তার মানে হল main এর জন্য একটা ব্লক, print এর জন্য একটা ব্লক যদি আমরা উপরের দুইটা মেথড কল্পনা করি।

আমরা জানি যে Stack এ push, pop operation use হয়(last in first out)। নিচের সিম্পল class টা কল্পনা করি।

public class MainClass{
         public static void main(String amarVariables[]){//প্রথমে যেহেতু main call হবে তাই stack এ এইটা ঠুকবে, so stack: main()

        int i = 1;
        MemoryManagement mgt = new MemoryManagement();//যেহেতু এইটা object এইটা heap এ চলে যাবে।

        String stringObject = new String();//heap এ যাবে

        mgt.print();//similarly print যেহেতু method, so stack : print()(top position), main();


        }
    }

উপরের program এ বলা হচ্ছে stack এ আগে main() ঠুকবে তারপর print() ঠুকবে এভাবে যত method থাকবে সবই push operation এর rules অনুযায়ী ঠুকবে & pop অনুযায়ী সবার শেষে main বের হবে, তারমানে program terminate হবে। ঘটনা হল আমার stack তো এখন ফাঁকা কিন্তু heap মেমোরির কি হবে? সমস্ত application এর কাজ শেষ হয়ে যাওয়ার পর Java এর Garbage Collection heap memory এর মধ্যে তল্লাশি করে দেখবে যে heap memory এর মধ্যে আর কোন object টির কাজ নেই, যেটার যেটার নেই এটাকে মেমোরি থেকে ফ্রি করে দিবে। :D :D

এখানে একটা কথা বলে রাখা ভাল সেটা হল stack memory এর সাইজ heap memory এর চেয়ে কম।

heap memory কে sharable/global memory ও বলে but stack memory ঐ নির্দিষ্ট method এর জন্য block create হয়। যদি stack memory full হয়ে যায় তার মানে এটার মধ্যে এতো পরিমাণ thread চলে যে সে আর লোড নিতে পারে না। তখন এক ধরনের error চলে আসে StackOverflowError. Similarly heap memory তে দিবে OutOfMemoryError.

See this link for with image :: http://salambrur.blogspot.com/2016/12/object-variable-method-program-main.html

permanent link

answered 23 Jan '17, 16:32

Abdus%20Salam's gravatar image

Abdus Salam
2319

edited 23 Jan '17, 16:44

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×68
×5
×4
×1

question asked: 18 Jan '17, 18:24

question was seen: 1,097 times

last updated: 23 Jan '17, 16:44