উইন্ডোজ 10 / ওপেনজেডকে 11.0.4_x64 এ নীচে কোড চালানো আউটপুট হিসাবে used: 197
এবং উত্পাদন করে expected usage: 200
। এর অর্থ হ'ল এক মিলিয়ন উপাদানগুলির 200 বাইট অ্যারে প্রায় গ্রহণ করে। 200 এমবি র্যাম। সবকিছু ভাল.
আমি যখন বাইট অ্যারের বরাদ্দ কোডে পরিবর্তিত new byte[1000000]
করতে new byte[1048576]
(যে 1024 * 1024 উপাদানের হয়,), এটা আউটপুট উত্পাদন করে used: 417
এবং expected usage: 200
। কি হ্যাক?
import java.io.IOException;
import java.util.ArrayList;
public class Mem {
private static Runtime rt = Runtime.getRuntime();
private static long free() { return rt.maxMemory() - rt.totalMemory() + rt.freeMemory(); }
public static void main(String[] args) throws InterruptedException, IOException {
int blocks = 200;
long initiallyFree = free();
System.out.println("initially free: " + initiallyFree / 1000000);
ArrayList<byte[]> data = new ArrayList<>();
for (int n = 0; n < blocks; n++) { data.add(new byte[1000000]); }
System.gc();
Thread.sleep(2000);
long remainingFree = free();
System.out.println("remaining free: " + remainingFree / 1000000);
System.out.println("used: " + (initiallyFree - remainingFree) / 1000000);
System.out.println("expected usage: " + blocks);
System.in.read();
}
}
ভিজ্যুভ্যালের সাথে কিছুটা গভীরভাবে তাকালে, আমি প্রত্যাশা অনুযায়ী প্রথম ক্ষেত্রে সবকিছু দেখতে পাচ্ছি:
দ্বিতীয় ক্ষেত্রে, বাইট অ্যারেগুলি ছাড়াও, আমি দেখতে পাই যে বাইট অ্যারেগুলির সমান পরিমাণ র্যাম গ্রহণ করছে একই সংখ্যক আন্ত অ্যারেগুলি:
এই অভ্যন্তরীণ অ্যারেগুলি, যাইহোক, তারা রেফারেন্সযুক্ত তা দেখায় না তবে আমি তাদের আবর্জনা সংগ্রহ করতে পারি না ... (বাইট অ্যারেগুলি যেখানে তারা রেফারেন্স করা হয়েছে ঠিক ঠিক তা দেখায়))
কোন ধারণা এখানে কি ঘটছে?
int[]
একটি বৃহতকে অনুকরণ করতে ব্যবহার করে এটির সাথে কি কিছু থাকতে পারে byte[]
?