জাভা অ্যারেতে থাকা উপাদানগুলির সংখ্যার কি সীমা রয়েছে? যদি তাই হয়, এটা কি?
জাভা অ্যারেতে থাকা উপাদানগুলির সংখ্যার কি সীমা রয়েছে? যদি তাই হয়, এটা কি?
উত্তর:
এটি পরীক্ষা করা খুব সহজ যদিও সঠিক উত্তরটি দেখেনি।
সাম্প্রতিক একটি হটস্পট ভিএম-এ সঠিক উত্তরটি দেওয়া হয়েছে Integer.MAX_VALUE - 5
। একবার আপনি এর বাইরে চলে যান:
public class Foo {
public static void main(String[] args) {
Object[] array = new Object[Integer.MAX_VALUE - 4];
}
}
তুমি পাও:
Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit
MAX_VALUE-2
উপাদানগুলিতে বরাদ্দ করতে পারি । এটি আমার বরাদ্দকৃত থেকে পৃথক, এবং আমি সত্যিই আশ্চর্য হয়েছি যে ভিএম দুটি "জিনিস" কীভাবে ব্যবহার করতে পারে (দৈর্ঘ্য 2 বাইটের সাথে খাপ খায় না)।
Integer.MAX_VALUE+1
, আপনার একটি পূর্ণসংখ্যা ওভারফ্লো হবে। জাভাতে অ্যারের আকারগুলি হয় int
না long
; আপনার অ্যারে, বাইটস বা রেফারেন্সগুলিতে আপনি কী ধরণের ডেটা সঞ্চয় করেন তা বিবেচ্য নয়। স্ট্রিংগুলি কেবল অবজেক্ট রেফারেন্স।
Integer.MAX_VALUE - 2
= 2 147 483 645 Java জাভা যদি আপনি এটিকে চালনা করেন তবে সফলভাবে এ জাতীয় অ্যারে বরাদ্দ করে -Xmx13G
। OutOfMemoryError: Java heap space
আপনি পাস হলে এটি ব্যর্থ হয় -Xmx12G
।
এটি (অবশ্যই) সম্পূর্ণ ভিএম-নির্ভর।
OpenJDK 7 ও 8 সোর্স কোড মাধ্যমে ব্রাউজিং java.util.ArrayList
, .Hashtable
, .AbstractCollection
, .PriorityQueue
, এবং .Vector
, আপনি দেখতে পারেন এই দাবি পুনরাবৃত্তি করা হচ্ছে:
/** * Some VMs reserve some header words in an array. * Attempts to allocate larger arrays may result in * OutOfMemoryError: Requested array size exceeds VM limit */ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
যা মার্টিন বুখহলজ (গুগল) দ্বারা 2010-05-09 এ যুক্ত হয়েছে ; ক্রিস হেগার্টি (ওরাকল) পর্যালোচনা করেছেন।
সুতরাং, সম্ভবত আমরা বলতে পারি যে সর্বাধিক "নিরাপদ" সংখ্যাটি 2 147 483 639 ( Integer.MAX_VALUE - 8
) হবে এবং "বৃহত্তর অ্যারে বরাদ্দের প্রয়াসের ফলস্বরূপ আউটআফমিউরিওর এর ফলাফল হতে পারে "।
(হ্যাঁ, বুখহলসের একক দাবির মধ্যে সমর্থনযোগ্য প্রমাণ অন্তর্ভুক্ত নয়, সুতরাং এটি কর্তৃপক্ষের কাছে একটি গণনা করা আবেদন Open এমনকি ওপেনজেডিকে-তেও আমরা এমন কোড দেখতে পাচ্ছি return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
যা MAX_ARRAY_SIZE
এখনও দেখায় যে এর বাস্তব ব্যবহার নেই does )
-8
?
-8
সংরক্ষিত শিরোনামের শব্দগুলি দখল করবে by
আসলে দুটি সীমা আছে। এক, অ্যারের জন্য সর্বাধিক উপাদান সূচকযোগ্য এবং দুটি, আপনার অ্যাপ্লিকেশনের জন্য উপলব্ধ মেমরির পরিমাণ। উপলব্ধ মেমরির পরিমাণ এবং অন্যান্য ডেটা স্ট্রাকচার দ্বারা ব্যবহৃত পরিমাণের উপর নির্ভর করে আপনি সর্বাধিক ঠিকানাযোগ্য অ্যারে উপাদানটিতে পৌঁছানোর আগে আপনি মেমরির সীমাতে আঘাত করতে পারেন।
এই নিবন্ধটি অনুসরণ করে http://en.wikedia.org/wiki/Criticism_of_ জাভা# লার্জ_আরয়েস :
৩১ − 21 (প্রায় ২.১ বিলিয়ন) এর বেশি উপাদানগুলির অ্যারে সমর্থন না করার জন্য জাভা সমালোচিত হয়েছিল । এটি ভাষার সীমাবদ্ধতা; জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন, বিভাগ 10.4, এ বলা হয়েছে:
অ্যারেগুলি অবশ্যই মানগুলি দ্বারা সূচিকৃত হতে হবে ... একটি দীর্ঘ সূচি্যের মান সহ একটি অ্যারে উপাদান অ্যাক্সেস করার চেষ্টা একটি সংকলন-সময় ত্রুটির ফলস্বরূপ।
বড় অ্যারেগুলিকে সমর্থন করার জন্য জেভিএম-এ পরিবর্তন করা দরকার। এই সীমাবদ্ধতা 2 বিলিয়ন উপাদানগুলির মধ্যে সংগ্রহ সীমাবদ্ধ হওয়া এবং 2 জিআইবি-র চেয়ে বড় মেমরি ফাইলের অক্ষমতার মতো ক্ষেত্রে নিজেকে প্রকাশ করে। জাভাতেও সত্যিকার বহু-মাত্রিক অ্যারের অভাব রয়েছে (স্বতঃস্ফূর্তভাবে মেমরির একক ব্লকগুলি একটি একক নির্দেশনা দ্বারা অ্যাক্সেস করা হয়েছে), যা বৈজ্ঞানিক এবং প্রযুক্তিগত কম্পিউটিংয়ের কার্যকারিতা সীমাবদ্ধ করে।
অ্যারেগুলি অ-নেতিবাচক পূর্ণসংখ্যার সূচকযুক্ত, তাই আপনি অ্যাক্সেস করতে পারবেন এমন সর্বাধিক অ্যারে আকার Integer.MAX_VALUE
। অন্য জিনিসটি আপনি কত বড় অ্যারে তৈরি করতে পারেন। এটি আপনার JVM
এবং অ্যারের সামগ্রীর ধরণের সর্বাধিক মেমরির উপর নির্ভর করে । প্রতিটি অ্যারের উপাদানটির আকার, উদাহরণ রয়েছে। byte = 1 byte
, int = 4 bytes
,Object reference = 4 bytes (on a 32 bit system)
সুতরাং 1 MB
আপনার মেশিনে যদি মেমরি উপলব্ধ থাকে তবে আপনি byte[1024 * 1024]
বা এর অ্যারে বরাদ্দ করতে পারেন Object[256 * 1024]
।
আপনার প্রশ্নের উত্তর দেওয়া - আপনি আকারের অ্যারে (সর্বাধিক উপলব্ধ মেমরি / অ্যারে আইটেমের আকার) বরাদ্দ করতে পারেন।
সংক্ষিপ্তসার - তাত্ত্বিকভাবে একটি অ্যারের সর্বাধিক আকার হবে Integer.MAX_VALUE
। ব্যবহারিকভাবে এটি নির্ভর করে যে আপনার কত স্মৃতি JVM
রয়েছে এবং এর মধ্যে ইতিমধ্যে অন্যান্য অবজেক্টগুলিতে কত বরাদ্দ রয়েছে।
আমি এভাবে বাইট অ্যারে তৈরি করার চেষ্টা করেছি
byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);
এই রান কনফিগারেশন সহ:
-Xms4G -Xmx4G
এবং জাভা সংস্করণ:
Openjdk সংস্করণ "1.8.0_141"
ওপেনজেডিকে রানটাইম এনভায়রনমেন্ট (1.8.0_141-বি 16 তৈরি করুন)
ওপেনজেডিকে 64-বিট সার্ভার ভিএম (25.141-বি 16, মিশ্র মোড তৈরি করুন)
এটি কেবল x> = 2 এর জন্য কাজ করে যার অর্থ একটি অ্যারের সর্বাধিক আকার হল পূর্ণসংখ্যা MA MAX_VALUE-2
মান যে উপরোক্ত
থ্রেড "মূল" java.lang.OutOfMemoryError ব্যতিক্রম: অনুরোধ করা অ্যারে আকার মেইন.মাইন (ভি। মেইন.জভা: 6) এ ভিএম সীমা অতিক্রম করেছে
হ্যাঁ, জাভা অ্যারেতে সীমা রয়েছে। জাভা অ্যারেতে সূচক হিসাবে একটি পূর্ণসংখ্যা ব্যবহার করে এবং জেভিএম দ্বারা সর্বাধিক পূর্ণসংখ্যা স্টোর 2 ^ 32 হয়। যাতে আপনি অ্যারেতে 2,147,483,647 টি উপাদান সংরক্ষণ করতে পারেন।
যদি আপনার সর্বোচ্চ-দৈর্ঘ্যের চেয়ে বেশি প্রয়োজন হয় তবে আপনি দুটি পৃথক অ্যারে ব্যবহার করতে পারেন তবে প্রস্তাবিত পদ্ধতিটি কোনও ফাইলে ডেটা সঞ্চয় করতে হয়। কারণ ফাইলটিতে ডেটা সংরক্ষণের কোনও সীমা নেই। কারণ আপনার স্টোরেজ ড্রাইভারগুলিতে থাকা ফাইলগুলি কিন্তু অ্যারেগুলি জেভিএমে সঞ্চিত রয়েছে। জেভিএম প্রোগ্রাম প্রয়োগের জন্য সীমিত জায়গা সরবরাহ করে।
একটি উপাদান সর্বাধিক সংখ্যা array
হয় (2^31)−1
বা2 147 483 647
Integer.MAX_VALUE - 1
, আপনি "java.lang.OutOfMemoryError: অনুরোধ করা অ্যারে আকার ভিএম সীমা ছাড়িয়েছে" পাবেন। উপরে JDK 6 উপাদান এবং সর্বোচ্চ সংখ্যা হল Integer.MAX_VALUE - 2
= 2 147 483 645.
আসলে এটি জাভা সীমাবদ্ধতা এটি 230 at 30-4 এ 1073741820 হচ্ছে। 2 ^ 31-1 নয়। ডুনো কেন তবে আমি জেডিকে ম্যানুয়ালি টেস্ট করেছি। 2 ^ 30-3 এখনও ভিএম ছাড়াই throw
সম্পাদনা: -1 থেকে -4 স্থির, উইন্ডোজ জেভিএম-এ চেক করা হয়েছে