আমি কীভাবে বলতে পারি যে আমি 64-বিট জেভিএম বা 32-বিট জেভিএম (কোনও প্রোগ্রামের মধ্যে থেকে) চলছে?


563

আমি কীভাবে বলতে পারি যে আমার অ্যাপ্লিকেশনটি চালিত JVM 32 বিট বা 64-বিট হয়? বিশেষত, প্রোগ্রামের মধ্যে এটি সনাক্ত করতে আমি কোন ফাংশন বা বৈশিষ্ট্যগুলি ব্যবহার করতে পারি?


3
কৌতূহলের বাইরে, আপনাকে কেন সিস্টেমটির প্রাকৃতিক আকার জানতে হবে? এর মতো বিশদগুলি জাভাতে বিমূর্ত হয়ে যায়, সুতরাং আপনার (তত্ত্বে, কমপক্ষে) এগুলি জানা উচিত নয়।
প্যাট্রিক নিডজিয়েলস্কি

3
এটি আমাকে পয়েন্টারগুলির কারণে অবজেক্টগুলির জন্য মেমরির প্রয়োজনীয়তার আনুমানিক অনুমান করতে দেয়। কৌতূহলও - মনে হয়েছিল যেন কোনও উপায় হওয়া উচিত তবে আমি কখনই এটি শুনিনি।
ববএমসিজি

85
জাভা নেটিভ ইন্টারফেসের সাথে ইন্টারঅ্যাক্ট করার সময় এই "বিস্তারিত" বিমূর্ত করা হয় না। 32-বিট ডিএলএলগুলি একটি 64-বিট জেভিএম (এবং বিপরীতে) দিয়ে লোড করা যায় না। সুতরাং এটি জেএনআই ব্যবহার করে এমন কারও পক্ষে যথেষ্ট প্রয়োজনীয় তথ্য। এটি অত্যন্ত দুঃখের বিষয় যে এই তথ্যটি পাওয়ার কোনও পোর্টেবল উপায় নেই বলে মনে হচ্ছে। একটি উপায় হ'ল প্রথমে ডিএলএল এর 32-বিট সংস্করণটি লোড করার চেষ্টা করা এবং যদি এটি ব্যর্থ হয় তবে 64-বিট সংস্করণ ইত্যাদি চেষ্টা করুন কুশল!
জুনাস পুলাক্কা

12
আরেকটি পরিস্থিতি যেখানে 32 বা 64 বিট জেভিএমের মধ্যে পার্থক্য করা ম্যাপ করা ফাইলগুলির জন্য গুরুত্বপূর্ণ। 32 বিট সিস্টেমে কেবল 2 জিবি ম্যাপ করা যায়, সুতরাং ফাইল বিভাগগুলিকে ম্যাপ করা এবং আনম্যাপ করা গুরুত্বপূর্ণ সেই অনুসারে যাতে এই সীমাটি অতিক্রম না করা যায়, যখন bit৪ বিট জেভিএম-তে সীমাটি অনেক বেশি, অনেক বেশি।
সিমোন গিয়ানী

2
প্রশ্নযুক্ত মেশিনে দ্রুততম হবে এমন সংখ্যার অ্যালগোরিদম চয়ন করতে সক্ষম হওয়ায় এটি খুব সুন্দর।
dfeuer

উত্তর:


317

আপনি এই সিস্টেমের সম্পত্তি পুনরুদ্ধার করুন যা এই জেভিএমের সাক্ষ্যটির সাথে চিহ্নিত করে:

System.getProperty("sun.arch.data.model");

সম্ভাব্য ফলাফলগুলি হ'ল:

  • "32" - 32-বিট জেভিএম
  • "64" - 64-বিট জেভিএম
  • "unknown" - অজানা জেভিএম

হটস্পট এফএকিউতে বর্ণিত হিসাবে :

জাভা কোড লেখার সময় আমি 32 এবং 64-বিট অপারেশনের মধ্যে কীভাবে পার্থক্য করব?

এমন কোনও পাবলিক এপিআই নেই যা আপনাকে 32 এবং 64-বিট অপারেশনের মধ্যে পার্থক্য করতে দেয়। লেখার একবারে অন্য প্ল্যাটফর্ম হিসাবে -৪-বিটের কথা ভাবেন, যে কোনও জায়গায় .তিহ্য চালান। তবে আপনি যদি কোডটি লিখতে চান যা প্ল্যাটফর্ম নির্দিষ্ট (আপনার জন্য লজ্জাজনক), সিস্টেম সম্পত্তি sun.arch.data.model এর মান "32", "64" বা "অজানা" আছে।

আপনার জাভা কোডটি যদি স্থানীয় লাইব্রেরির উপর নির্ভর করে এবং আপনার লাইব্রেরির 32- বা 64-বিট সংস্করণটি প্রারম্ভকালে লোড করবেন কিনা তা নির্ধারণ করা দরকার যেখানে এটি প্রয়োজনীয় হতে পারে তার একটি উদাহরণ।


22
আমি sun.*কোনও আইবিএম জেভিএম সহ সিস্টেমের বৈশিষ্ট্যগুলি খুঁজে পাওয়ার আশা করব না । অন্য কথায়, এটি পোর্টেবল নয়।
পাস্কেল থিভেন্ট

8
কমান্ড লাইন থেকে আপনি কীভাবে বলতে পারেন? আপনি যদি 32-বিট বা 64-বিট চালাচ্ছেন? উৎসুক.
জোনাট্রন

17
কেন গৃহীত উত্তর সান নির্ভর? মালিকানাধীন সূর্য প্যাকেজ ব্যবহার না করেই "os.arch" একই কাজটি সম্পাদন করবে।
b1nary.atr0phy

7
@ b1naryatr0phy, অপারেটিং সিস্টেম, বা জেভিএম সম্পর্কে os.arch রিপোর্ট করে? আমি প্রায়শই উন্নয়নের জন্য আমার 64৪-বিট ওয়ার্কস্টেশনে 32-বিট জেভিএম চালিত করি।
skiphoppy

7
এই সম্পত্তিটি আইবিএম জেভিএমগুলিতে সমর্থিত, তবে জিসিজে নয়। স্ট্যাকওভারফ্লো.com
ইমানুয়েল

707

জাভার নির্দিষ্ট সংস্করণগুলির জন্য, আপনি পতাকাগুলি -d32এবং কমান্ড লাইন থেকে জেভিএমের সাক্ষ্য পরীক্ষা করতে পারেন -d64

$ java -help
...
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available

একটি 64-বিট জেভিএম পরীক্ষা করতে, চালান:

$ java -d64 -version

যদি এটি 64৪-বিট জেভিএম না হয় তবে আপনি এটি পাবেন:

Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.

একইভাবে, 32-বিট জেভিএম পরীক্ষা করতে, চালান:

$ java -d32 -version

যদি এটি 32-বিট জেভিএম না হয় তবে আপনি এটি পাবেন:

Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.

এই পতাকাগুলি জাভা 7 এ যুক্ত করা হয়েছিল, জাভা 9-এ অবমূল্যায়িত হয়েছে, জাভা 10-তে সরানো হয়েছে এবং জাভা-র আধুনিক সংস্করণগুলিতে আর উপলভ্য নয়।


3
যদিও এটি জেনে রাখা ভাল, এটি প্রোগ্রামের বাইরে থেকে চালানো বা নতুন প্রক্রিয়া শুরু করার জন্য জাভা বিকল্পগুলি ব্যবহার করা আমার পক্ষে দরকারী নয় b
ববএমসিজি

13
ঠিক আমি খুঁজছেন ছিল কি. এবং আপনি java -d32 -version32-বিট চালাচ্ছেন না তা যাচাই করতে আপনি চালাতে পারেন । দু'জনেই কাজ করতে চাই Win7
জোনাট্রন

31
আমি উইন্ডোজ 7 এ আছি এবং আমি 'অচেনা বিকল্প' ত্রুটি পেয়েছি java -d32 -version এবং থেকেও পেয়েছি java -d64 -version
এলী

40
"-D64" ব্যবহার করবেন না, এর জন্য সম্পূর্ণ ভিন্ন কিছু ঘটে। এটি "64" নামে একটি সিস্টেমের বৈশিষ্ট্য নির্ধারণ করে। এটি এখানে যা চেয়েছিল তা অবশ্যই নয়।
জোনাথন হেডল্যান্ড

9
-D32 বা -d64 পতাকা কেবল জাভা 7 বা ততোধিকের জন্য কাজ করবে will
darrenmc

187

java -versionআপনার কনসোলটি কেবল টাইপ করুন।

যদি bit৪ বিটের সংস্করণটি চলমান থাকে তবে আপনি একটি বার্তা পাবেন:

java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)

একটি 32 বিট সংস্করণ এর অনুরূপ কিছু দেখায়:

java version "1.6.0_41"
Java(TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot(TM) Client VM (build 20.14-b01, mixed mode, sharing)

তৃতীয় লাইনের Clientপরিবর্তে নোট করুন 64-Bit ServerClient/Serverঅংশ অপ্রাসঙ্গিক, এটা অভাবে এর 64-Bitযে বিষয়ে।

যদি আপনার সিস্টেমে একাধিক জাভা সংস্করণ ইনস্টল করা থাকে তবে আপনি যে জাভা সংস্করণটি চেক করতে চান তার / বিন ফোল্ডারে নেভিগেট করুন এবং java -versionসেখানে টাইপ করুন ।


তবে এইচপি ননস্টপ
ওএস এনভিতে

28
ওপি বিশেষত প্রোগ্রামের মধ্যে বলেছে ।
টোমা জ্যাটো - মনিকা

34

আমি 32-বিট জেভিএম ইনস্টল করেছি এবং এটিকে আবার চেষ্টা করেছি, নিম্নলিখিতটি দেখে মনে হচ্ছে আপনি ওএস আর্চকে নয়, জেভিএম সাক্ষ্য দিচ্ছেন:

System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "amd64" when using 64-bit JVM

এটি সান এবং আইবিএম জেভিএম (32 এবং 64-বিট) উভয়ের বিরুদ্ধে পরীক্ষা করা হয়েছিল। স্পষ্টতই, সিস্টেম সম্পত্তি কেবল অপারেটিং সিস্টেম খিলান নয়।


7
এটি অপারেটিং সিস্টেমের আর্কিটেকচারের তথ্য দেয়। আমি যদি ভুল না করি তবে এটি জেভিএম সাক্ষীর মতো হওয়া উচিত নয়।
কোডাডিকিট

2
@ কোডডিক্টিক্ট, দেখে মনে হচ্ছে এটি সত্যই জেভিএমের সাক্ষ্য।
ব্রায়ান্টসই

20
@ কোডাডিক্টিক্টটি সম্পূর্ণ মিথ্যা (এবং ছয়জন পিপিএল কেন এই মন্তব্য করেছে বলে আমার ধারণা নেই।) "ওএসআরচ" জেভিএম সংস্করণটি ফেরত দেওয়ার জন্য ডিজাইন করা হয়েছে। এটি নিজের জন্য পরীক্ষা করে নিন এবং আপনি যদি ওএস সনাক্তকরণের জন্য প্রকৃতপক্ষে নির্ভর করে থাকেন তবে godশ্বর আপনাকে সহায়তা করুন।
b1nary.atr0phy

6
os.archঅনেকগুলি সম্ভাব্য মান রয়েছে, এটি 32 বা 64 বিট কিনা তা বলা মুশকিল। Lopica.sourceforge.net/os.html
ইমানুয়েল

2
এটি মানুষের চোখের জন্য তৈরি একটি স্ট্রিং এবং বৈধ মানগুলির কঠোর সংজ্ঞা ব্যতীত, এর উপর নির্ভর করা ভাল ধারণা নয় - কোডটি লিখুন যা পরিবর্তে প্রকৃত কার্যকারিতা পরীক্ষা করে।
থরবজর্ন রাভন অ্যান্ডারসন

15

পরিপূরক তথ্য:

একটি উপর চলমান প্রক্রিয়া আপনি (কিছু সাম্প্রতিক সূর্যের JDK5 / 6 সংস্করণের সাথে অন্তত) ব্যবহার করতে পারেন:

$ /opt/java1.5/bin/jinfo -sysprops 14680 | grep sun.arch.data.model
Attaching to process ID 14680, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.5.0_16-b02
sun.arch.data.model = 32

যেখানে 14680 অ্যাপ্লিকেশনটি চালাচ্ছে jvm এর পিআইডি। "os.arch "ও কাজ করে।

এছাড়াও অন্যান্য পরিস্থিতিতে সমর্থিত:

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP 

তবে এই নোটটিও বিবেচনা করুন:

" দ্রষ্টব্য - এই ইউটিলিটিটি অসমর্থিত এবং জেডিকে ভবিষ্যতের সংস্করণগুলিতে উপলভ্য বা নাও থাকতে পারে Windows PATH এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে লক্ষ্য প্রক্রিয়া দ্বারা ব্যবহৃত jvm.dll এর অবস্থান বা ক্র্যাশ ডাম্প ফাইলটি উত্পাদিত হয়েছিল এমন অবস্থান থাকতে হবে।


7

লিনাক্সে, আপনি নিম্নলিখিত দুটি কমান্ডের মাধ্যমে ELF শিরোনামের তথ্য পেতে পারেন:

file {YOUR_JRE_LOCATION_HERE}/bin/java

o / p: ELF 64-বিট এলএসবি এক্সিকিউটেবল জিএনইউ / লিনাক্স ২.৪.০-এর জন্য ইএনএফ / লিনাক্স ২.৪.০-এর জন্য এলএলএফ -৪ , এএমডি এক্স ৮86-6464, সংস্করণ ১ (এসওয়াইএসভি), গতিযুক্তভাবে সংযুক্ত (শেয়ারড লিবস ব্যবহার করে), ছিটানো হয়নি

অথবা

readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'

o / p: শ্রেণি: ELF 64


6

আপনি যদি জেএনএ ব্যবহার করছেন তবে আপনি com.sun.jna.Native.POINTER_SIZE == 4(32 বিট) বা com.sun.jna.Native.POINTER_SIZE == 8(64 বিট) পরীক্ষা করতে পারেন can


এটি বুদ্ধিমান তবে পয়েন্টার আকারটি অ্যাক্সেস করা অন্যান্য সমাধানগুলির তুলনায় এখানে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায় (এটি শুরু করতে কিছুটা সময় প্রয়োজন)।
বুলিভিআইপ্লাজা

1

উইন্ডোজ and এর অধীনে " প্রোগ্রামস | প্রোগ্রামস এবং ফিচারস " এর অধীনে " কন্ট্রোল প্যানেল " এর অধীনে জেআরই এবং জেডিকে-র 64৪-বিট রূপগুলি বন্ধনীতে "in৪- বিট " দিয়ে তালিকাভুক্ত করা হয়েছে (উদাঃ " জাভা এসই ডেভলপমেন্ট কিট 65 আপডেট (৫ (-৪-বিট) ) "), যখন 32-বিট ভেরিয়েন্টের জন্য বৈকল্পিকগুলি প্রথম বন্ধনীতে উল্লিখিত হয়নি (উদাহরণস্বরূপ কেবল" জাভা এসই বিকাশ কিট 8 আপডেট 60 ")।


1

আপনি যদি জেএনএ ব্যবহার করছেন তবে আপনি এটি করতে পারেন Platform.is64Bit()


-1

জন্য Windows, আপনি Javaবাড়ির অবস্থান পরীক্ষা করতে পারেন । যদি এটি থাকে (x86)তবে তা 32-bitঅন্যথায় 64-bit:

public static boolean is32Bit()
{
    val javaHome = System.getProperty("java.home");
    return javaHome.contains("(x86)");
}

public static boolean is64Bit()
{
    return !is32Bit();
}

উদাহরণ উদাহরণ:

C:\Program Files (x86)\Java\jdk1.8.0_181\bin\java.exe # 32-bit
C:\Program Files\Java\jdk-10.0.2\bin\java.exe # 64-bit

কেন Windowsএকমাত্র সমাধান সম্পর্কে যত্ন ?

আপনি কোন বিট সংস্করণটি চালাচ্ছেন তা যদি জানতে হয় তবে আপনি সম্ভবত নেটিভ কোডটি নিয়ে ঘুরে বেড়াচ্ছেন Windowsসুতরাং প্ল্যাটফর্ম-স্বাধীনতা যেভাবেই উইন্ডো থেকে বাইরে।


-2

জেভিএম এর সংস্করণ পেতে বর্তমানে প্রোগ্রামটি চলছে

System.out.println(Runtime.class.getPackage().getImplementationVersion());

আপনি কি জেভিএম বা অপারেটিং সিস্টেমের জন্য রিপোর্ট করবেন? আপনি একটি 64-বিট অপারেটিং সিস্টেমে 32-বিট জেভিএম চালাতে পারেন।
থরবজর্ন রাভন অ্যান্ডারসন

এটি জেএমএক্স ব্যবহার করে না?
থরবজর্ন রাভন অ্যান্ডারসন

2
মত এই আয় কিছু 1.8.0_172বা nullউপর Java 10এবং যেকোনোভাবে প্রশ্নের উত্তর নেই।
বুলিভিআইপ্লাজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.