জাভা অ্যারেগুলির কি সর্বোচ্চ আকার রয়েছে?


214

জাভা অ্যারেতে থাকা উপাদানগুলির সংখ্যার কি সীমা রয়েছে? যদি তাই হয়, এটা কি?


5
আপনি একটি ভুল উত্তর গ্রহণ করেছেন, কেবল এত দীর্ঘ অ্যারে বরাদ্দ করার চেষ্টা করুন (এবং না, আমি স্মৃতিশক্তি শেষ করছি না)।
মার্টিনাস

ঘনিষ্ঠভাবে সম্পর্কিত: stackoverflow.com/questions/878309/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


184

এটি পরীক্ষা করা খুব সহজ যদিও সঠিক উত্তরটি দেখেনি।

সাম্প্রতিক একটি হটস্পট ভিএম-এ সঠিক উত্তরটি দেওয়া হয়েছে 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

57
আমি মনে করি ডাউনওয়োটসের ধারণাটি কোনও অর্থবোধ করে না, যদি না আমরা সরল এবং সহজভাবে ভুল যে উত্তরগুলি হ্রাস করতে ইচ্ছুক না হই । পাঁচটি বাইটের পার্থক্য আসলে বাস্তব জগতের মধ্যে গুরুত্বপূর্ণ, না, অবশ্যই তা নয়। তবে এটি আমার উদ্বেগজনক যে লোকেরা সত্যিই এটি কার্যকর কিনা তা দেখার চেষ্টা না করেই "অনুমোদনমূলক" একটি উত্তর দিতে ইচ্ছুক। মেমরি সীমা হিসাবে, ভাল, DUH। এটি যদি আপনি আমাকে জিজ্ঞাসা করেন যে "আপনি কতটি আঙ্গুর খেতে পারেন?" এবং আমি বলেছিলাম "আচ্ছা, ফ্রিজে আমার কতজন ছিল তার উপর এটি নির্ভর করে।"
কেভিন বোউরিলিয়ন

7
আপনি কেন জানেন যে এটি আপনাকে এই পাঁচটি বাইট দেয় না কেন ? এটি কি অগত্যা জাভাতে সর্বদা ঘটে এমন কিছু বা এটি কেবল আপনার কম্পিউটারের স্মৃতি বা কোনও কিছুর সাথে সম্পর্কিত হতে পারে?
তাইমন

17
@ কেভিন বুউরিলিয়ন: মনে হচ্ছে এটি পরিবর্তিত হয়েছে, ওরাকল ১.7.০.০.০ ব্যবহার করে আমি MAX_VALUE-2উপাদানগুলিতে বরাদ্দ করতে পারি । এটি আমার বরাদ্দকৃত থেকে পৃথক, এবং আমি সত্যিই আশ্চর্য হয়েছি যে ভিএম দুটি "জিনিস" কীভাবে ব্যবহার করতে পারে (দৈর্ঘ্য 2 বাইটের সাথে খাপ খায় না)।
মার্টিনাস

3
টম্যাজাতো সর্বশেষতম Integer.MAX_VALUE+1, আপনার একটি পূর্ণসংখ্যা ওভারফ্লো হবে। জাভাতে অ্যারের আকারগুলি হয় intনা long; আপনার অ্যারে, বাইটস বা রেফারেন্সগুলিতে আপনি কী ধরণের ডেটা সঞ্চয় করেন তা বিবেচ্য নয়। স্ট্রিংগুলি কেবল অবজেক্ট রেফারেন্স।
কিট আছে - অ্যানি-মুউসে

8
JDK 6 এবং এর উপরে একটি অ্যারের উপাদানগুলির সর্বাধিক সংখ্যা Integer.MAX_VALUE - 2= 2 147 483 645 Java জাভা যদি আপনি এটিকে চালনা করেন তবে সফলভাবে এ জাতীয় অ্যারে বরাদ্দ করে -Xmx13GOutOfMemoryError: Java heap spaceআপনি পাস হলে এটি ব্যর্থ হয় -Xmx12G
আলেক্সি ইভানভ

127

এটি (অবশ্যই) সম্পূর্ণ ভিএম-নির্ভর।

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?
উইন্টার

@Pacerier। আপনি যখন অ্যারেলিস্ট ব্যবহার করছেন তখনই কি এই MAX_ARRAY_SIZE প্রয়োগ করা উচিত নয়? এটি int [] অ্যারে = নতুন ইনট [কিছু_মূল্য_ এখানে] এর মতো অ্যারে ব্যবহার করা থেকে পৃথক; তাই না? অ্যারেলিস্টে সংজ্ঞায়িত ধ্রুবক কেন একটি সাধারণ অ্যারেতে প্রয়োগ করা যেতে পারে ([] দিয়ে সংজ্ঞায়িত)? পর্দার পিছনে তারা কি একই রকম?
টিয়াগো

1
@ টিয়াগো, না, কোডটি নিজেই সর্বাধিক আকারের অ্যারের সাথে কিছুই করতে পারে নি। এটি কেবল দাবি।
পেসারিয়ার

@ জনওয়ান্টার, উক্তিটি উল্লেখ করেছে "কিছু ভিএম কিছু শিরোনামের শুল্ক একটি অ্যারেতে সংরক্ষণ করে"। তাই এটি -8সংরক্ষিত শিরোনামের শব্দগুলি দখল করবে by
পেসারিয়ার

38

আসলে দুটি সীমা আছে। এক, অ্যারের জন্য সর্বাধিক উপাদান সূচকযোগ্য এবং দুটি, আপনার অ্যাপ্লিকেশনের জন্য উপলব্ধ মেমরির পরিমাণ। উপলব্ধ মেমরির পরিমাণ এবং অন্যান্য ডেটা স্ট্রাকচার দ্বারা ব্যবহৃত পরিমাণের উপর নির্ভর করে আপনি সর্বাধিক ঠিকানাযোগ্য অ্যারে উপাদানটিতে পৌঁছানোর আগে আপনি মেমরির সীমাতে আঘাত করতে পারেন।


27

এই নিবন্ধটি অনুসরণ করে http://en.wikedia.org/wiki/Criticism_of_ জাভা# লার্জ_আরয়েস :

৩১ − 21 (প্রায় ২.১ বিলিয়ন) এর বেশি উপাদানগুলির অ্যারে সমর্থন না করার জন্য জাভা সমালোচিত হয়েছিল । এটি ভাষার সীমাবদ্ধতা; জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন, বিভাগ 10.4, এ বলা হয়েছে:

অ্যারেগুলি অবশ্যই মানগুলি দ্বারা সূচিকৃত হতে হবে ... একটি দীর্ঘ সূচি্যের মান সহ একটি অ্যারে উপাদান অ্যাক্সেস করার চেষ্টা একটি সংকলন-সময় ত্রুটির ফলস্বরূপ।

বড় অ্যারেগুলিকে সমর্থন করার জন্য জেভিএম-এ পরিবর্তন করা দরকার। এই সীমাবদ্ধতা 2 বিলিয়ন উপাদানগুলির মধ্যে সংগ্রহ সীমাবদ্ধ হওয়া এবং 2 জিআইবি-র চেয়ে বড় মেমরি ফাইলের অক্ষমতার মতো ক্ষেত্রে নিজেকে প্রকাশ করে। জাভাতেও সত্যিকার বহু-মাত্রিক অ্যারের অভাব রয়েছে (স্বতঃস্ফূর্তভাবে মেমরির একক ব্লকগুলি একটি একক নির্দেশনা দ্বারা অ্যাক্সেস করা হয়েছে), যা বৈজ্ঞানিক এবং প্রযুক্তিগত কম্পিউটিংয়ের কার্যকারিতা সীমাবদ্ধ করে।


6
জাভাতে বহুমাত্রিক অ্যারেগুলির সিনট্যাকটিক চিনির অভাব রয়েছে, তবে আপনি এখনও তাদের সামান্য
বিভাজন

11

অ্যারেগুলি অ-নেতিবাচক পূর্ণসংখ্যার সূচকযুক্ত, তাই আপনি অ্যাক্সেস করতে পারবেন এমন সর্বাধিক অ্যারে আকার 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রয়েছে এবং এর মধ্যে ইতিমধ্যে অন্যান্য অবজেক্টগুলিতে কত বরাদ্দ রয়েছে।


3

আমি এভাবে বাইট অ্যারে তৈরি করার চেষ্টা করেছি

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

হ্যাঁ, জাভা অ্যারেতে সীমা রয়েছে। জাভা অ্যারেতে সূচক হিসাবে একটি পূর্ণসংখ্যা ব্যবহার করে এবং জেভিএম দ্বারা সর্বাধিক পূর্ণসংখ্যা স্টোর 2 ^ 32 হয়। যাতে আপনি অ্যারেতে 2,147,483,647 টি উপাদান সংরক্ষণ করতে পারেন।

যদি আপনার সর্বোচ্চ-দৈর্ঘ্যের চেয়ে বেশি প্রয়োজন হয় তবে আপনি দুটি পৃথক অ্যারে ব্যবহার করতে পারেন তবে প্রস্তাবিত পদ্ধতিটি কোনও ফাইলে ডেটা সঞ্চয় করতে হয়। কারণ ফাইলটিতে ডেটা সংরক্ষণের কোনও সীমা নেই। কারণ আপনার স্টোরেজ ড্রাইভারগুলিতে থাকা ফাইলগুলি কিন্তু অ্যারেগুলি জেভিএমে সঞ্চিত রয়েছে। জেভিএম প্রোগ্রাম প্রয়োগের জন্য সীমিত জায়গা সরবরাহ করে।


1

একটি উপাদান সর্বাধিক সংখ্যা arrayহয় (2^31)−1বা2 147 483 647


5
জাভা আকারের অ্যারে বরাদ্দ করতে পারে না Integer.MAX_VALUE - 1, আপনি "java.lang.OutOfMemoryError: অনুরোধ করা অ্যারে আকার ভিএম সীমা ছাড়িয়েছে" পাবেন। উপরে JDK 6 উপাদান এবং সর্বোচ্চ সংখ্যা হল Integer.MAX_VALUE - 2= 2 147 483 645.
আলেক্সি ইভানভ

0

আসলে এটি জাভা সীমাবদ্ধতা এটি 230 at 30-4 এ 1073741820 হচ্ছে। 2 ^ 31-1 নয়। ডুনো কেন তবে আমি জেডিকে ম্যানুয়ালি টেস্ট করেছি। 2 ^ 30-3 এখনও ভিএম ছাড়াই throw

সম্পাদনা: -1 থেকে -4 স্থির, উইন্ডোজ জেভিএম-এ চেক করা হয়েছে


আপনি 32-বিট জেভিএম ব্যবহার করছেন। একটি 64-বিট জেভিএম ব্যবহার করুন এবং জেভিএম সীমা 2 ^ 31 এর কাছাকাছি হবে। (আপনার জন্য প্রয়োজনীয় গাদা স্থানও পাওয়া দরকার যা ডিফল্ট নয় এবং এটি আপনার শারীরিক স্মৃতি দ্বারা প্রভাবিত হবে))
dave_thompson_085
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.