কোনও জাভা অ্যারে কি আদিমতার স্ট্যাক স্ট্যাক বা গাদাতে রাখা হয়?


85

আমার এর মতো অ্যারে ডিক্লেয়ারেশন রয়েছে:

int a[];

এখানে aআদিম intধরণের অ্যারে রয়েছে । এই অ্যারে কোথায় সঞ্চিত? এটি গাদা বা স্ট্যাকের উপর সংরক্ষণ করা হয়? এটি একটি intআদিম প্রকার , সমস্ত আদিম ধরণগুলি গাদাতে সংরক্ষণ করা হয় না।


39
এটি কোন অ্যারে নয়। এটি একটি অ্যারের রেফারেন্স। রেফারেন্সটি নিজেই কোনও শ্রেণি বা অবজেক্টের সদস্য হলে, বা যদি কোনও পদ্ধতিতে স্থানীয় পরিবর্তনশীল হয় তবে স্ট্যাকের উপরে এটি সংরক্ষণ করা যেতে পারে। এবং আদিম ধরণেরগুলি হিপগুলিতে সংরক্ষণ করা যেতে পারে যদি তারা কোনও শ্রেণি বা অবজেক্টের সদস্য হয়।
চাচা

উত্তর:


145

গুরুকুলকি যেমন বলেছিল, এটি স্তূপে সঞ্চিত। যাইহোক, আপনার পোস্টটি সম্ভবত কোনও উদ্দেশ্যপ্রণোদিত ব্যক্তি এমন পৌরাণিক কল্পিত প্রচারের কারণে একটি ভুল বোঝাবুঝির পরামর্শ দিয়েছে যা "আদিমরা সর্বদা স্ট্যাকের উপরে থাকে"। এটি অসত্য। স্থানীয় ভেরিয়েবলগুলির স্ট্যাকের মান রয়েছে তবে সমস্ত আদিম ভেরিয়েবল স্থানীয় নয় ...

উদাহরণস্বরূপ, এটি বিবেচনা করুন:

public class Foo
{
    int value;
}
...

public void someOtherMethod()
{
    Foo f = new Foo();
    ...
}

এখন কোথায় থাকে f.value? পৌরাণিক কাহিনীটি এটি স্ট্যাকের উপরে রাখার পরামর্শ দেবে - তবে আসলে এটি নতুন Fooবস্তুর অংশ , এবং স্তূপ 1 এ বাস করে । (মনে রাখবেন যে নিজের মানটি fএকটি রেফারেন্স এবং স্ট্যাকের উপরে থাকে))

সেখান থেকে এটি অ্যারে করার সহজ পদক্ষেপ। আপনি অ্যারেটিকে কেবল প্রচুর ভেরিয়েবল হিসাবে ভাবতে পারেন - তাই new int[3]এই ফর্মটির শ্রেণি থাকার মতো কিছুটা:

public class ArrayInt3
{
    public readonly int length = 3;
    public int value0;
    public int value1;
    public int value2;
}

1 আসলে, এটি এর চেয়ে জটিল। স্ট্যাক / গাদা পার্থক্য বেশিরভাগই একটি বাস্তবায়নের বিশদ - আমি বিশ্বাস করি কিছু জেভিএম, সম্ভবত পরীক্ষামূলকভাবে বলা যেতে পারে যে কোনও বস্তু কখন কোনও পদ্ধতি থেকে "পলায়ন" না করে এবং স্ট্যাকের পুরো বস্তুটি বরাদ্দ করতে পারে। তবে আপনি যত্ন নিতে বেছে নিলে ধারণাটি হ'ল


4
আমাদের সম্পর্কে "পালাবার analyisis" জাভা: blog.juma.me.uk/2008/12/17/objects-with-no-allocation-overhead এরা বলছে এটি JDK 6 আপডেট করুন 14 আগাম অ্যাক্সেস মুক্তির পর উপস্থিত থাকলে, এবং যেহেতু JDK 6 আপডেট করুন 23 ডিফল্টভাবে সক্রিয়
গাইডো

অ্যারে পাবলিক স্ট্যাটিক ফাইনাল হলে কি এটি কিছু পরিবর্তন করে? এটি কি তখন ধ্রুব পুলের অংশ হওয়া উচিত নয়?
মালাচিয়াস

@ মালাচিয়াজ: না একটি অ্যারে কখনও ধ্রুবক হয় না।
জন স্কিটি

@ জনস্কিট: জাভা গ্রন্থাগারের সমস্ত সংস্করণে আমি সচেতন, প্রত্যেককে Stringএকটি দ্বারা সমর্থন করা হয় char[]। আমি বিশ্বাস করি যে আক্ষরিক স্ট্রিংগুলি সর্বজনীন ধ্রুবক পুলে সংরক্ষণ করা হয়; জিসি অপ্টিমাইজেশনের জন্য, এটি বোঝায় যে ব্যাকিং অ্যারেগুলিও একইভাবে সংরক্ষণ করা উচিত (অন্যথায় ধ্রুব পুলটি কোনও জিসি চক্রের সময় স্ক্যান করতে হবে যেখানে ব্যাকিং অ্যারে অন্যথায় সংগ্রহের জন্য যোগ্য হবে)।
সুপারক্যাট

@ সুপের্যাট: হ্যাঁ, তা বোঝা যাবে। তবে আপনি যে কোনও অ্যারে নিজেকে ঘোষণা করেন তা ধ্রুব পুলের অংশ হিসাবে শেষ হয় না।
জন স্কিটি

37

এটি স্তূপে সংরক্ষণ করা হবে

কারণ অ্যারে জাভাতে একটি বস্তু।

সম্পাদনা : আপনি যদি

int [] testScores; 
testScores = new int[4];

এই কোডটি সংকলককে বলে মনে করুন, "এমন একটি অ্যারে অবজেক্ট তৈরি করুন যা চারটি ইন্টি ধরে রাখবে এবং নামটি রেফারেন্স ভেরিয়েবলের জন্য এটি অর্পণ করবে testScores। এছাড়াও, এগিয়ে যান এবং প্রতিটি intউপাদান শূন্যে সেট করুন Thanks ধন্যবাদ"


4
এবং টেস্টস্কোরস নামক রেফারেন্স ভেরিয়েবল (গাদাতে অ্যারের দিকে নির্দেশ করা) স্ট্যাকের মধ্যে থাকবে।
জাকি

11
কোডটি কেবল "ধন্যবাদ" বলে যদি আপনি -gসংকলকটিতে বিকল্পটি সরবরাহ করেন supply অন্যথায় এটি অপ্টিমাইজড হবে।
জনতা

4
@ মোব আপনি একটি ধারণা করছেন যে এটিই কেবল কোড। অনুমান করা ভাল যে এই দুটি লাইন একটি বৃহত্তর প্রোগ্রামের অংশ যা আসলে অ্যারে ব্যবহার করে।
কোড-শিক্ষানবিস

22

এটি আদিম ধরণের একটি অ্যারে যা নিজে থেকেই আদিম নয়। থাম্বের একটি ভাল নিয়ম হল যখন নতুন কীওয়ার্ড জড়িত তখন ফলাফলটি হ'ল।


19

আমি এই বিষয়ে আমি চালানো কয়েকটি পরীক্ষা ভাগ করে নিতে চেয়েছিলাম।

10 মিলিয়ন আকারের অ্যারে

public static void main(String[] args) {
    memInfo();
    double a[] = new double[10000000];
    memInfo();
}

আউটপুট:

------------------------
max mem = 130.0 MB
total mem = 85.0 MB
free mem = 83.6 MB
used mem = 1.4 MB
------------------------
------------------------
max mem = 130.0 MB
total mem = 130.0 MB
free mem = 48.9 MB
used mem = 81.1 MB
------------------------

আপনি দেখতে পাচ্ছেন যে ব্যবহৃত হিপ আকারটি MB 80 এমবি বৃদ্ধি পেয়েছে যা 10 মি * আকারের (ডাবল) হয়।

তবে আমাদের যদি ডাবলের পরিবর্তে ডাবল ব্যবহার করা হয়

public static void main(String[] args) {
    memInfo();
    Double a[] = new Double[10000000];
    memInfo();
}

আউটপুট 40MB প্রদর্শন করবে। আমাদের কেবল ডাবল রেফারেন্স রয়েছে, সেগুলি আরম্ভ করা হয়নি।

এটি ডাবল দিয়ে পূরণ করুন

public static void main(String[] args) {
    memInfo();
    Double a[] = new Double[10000000];      
    Double qq = 3.1d;
    for (int i = 0; i < a.length; i++) {
        a[i] = qq;
    }
    memInfo();
}

এখনও 40 এমবি। কারণ তারা সবাই একই ডাবল অবজেক্টের দিকে নির্দেশ করে।

পরিবর্তে ডাবল দিয়ে শুরু করা হচ্ছে

public static void main(String[] args) {
    memInfo();
    Double a[] = new Double[10000000];
    Double qq = 3.1d;
    for (int i = 0; i < a.length; i++) {
        a[i] = qq.doubleValue();
    }
    memInfo();
}

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

লাইন

a[i] = qq.doubleValue();

সমতুল্য

a[i] = Double.valueOf(qq.doubleValue());

যা সমান

a[i] = new Double(qq.doubleValue());

যেহেতু আমরা প্রতিবার নতুন ডাবল অবজেক্ট তৈরি করি, তাই আমরা গাদাটি ফুটিয়ে তুলি। এটি দেখায় যে ডাবল ক্লাসের মানগুলি হিপতে সঞ্চয় করা হয়।


4
আপনি কি মেমি ইনফো () প্লিজের কোড বিশদটি পেস্ট করতে পারবেন? :)
হেডলিয়ান

2

জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে অ্যারেগুলি হ'ল অবজেক্টস, ডাইনামিকভাবে তৈরি করা হয় এবং অবজেক্ট টাইপের ভেরিয়েবলগুলিতে নিয়োগ দেওয়া হতে পারে।

http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.