Windows 10 पर नीचे कोड रनिंग / OpenJDK 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 सरणियों की समान संख्या देखता हूं:
ये int सरणियाँ, वैसे, यह नहीं दिखाती हैं कि उन्हें संदर्भित किया गया है, लेकिन मैं उन्हें इकट्ठा नहीं कर सकता ... (बाइट सरणियाँ ठीक वही दिखाती हैं जहाँ उन्हें संदर्भित किया जाता है।)
किसी भी विचार यहाँ क्या हो रहा है?
int[]
एक बड़े का अनुकरण करने के लिए आंतरिक रूप से JVM के साथ कुछ करने के लिए हो सकता byte[]
है?