मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जिसे एक विशिष्ट आकार की स्मृति का उपभोग करना चाहिए। एक मुद्दा जो मैं सोच रहा हूं वह यह है कि मुझे वास्तव में ढेर में एक खाली स्थान होने पर outOfMemory
अपवाद मिल रहा है।पूरी मेमोरी का उपभोग नहीं कर सकता
import java.util.Vector;
import java.lang.*;
public class MemoryEater1 {
public static void main(String[] args) {
try {
long mb = Long.valueOf(args[0]);
Vector v = new Vector();
Runtime rt = Runtime.getRuntime();
while (true) {
if (v.size() > 0) {
if (((long) v.size())*100 < mb) {
System.out.println("total memory: " + rt.totalMemory()/1024/1024);
System.out.println("max memory: " + rt.maxMemory()/1024/1024);
System.out.println("free memory: " + rt.freeMemory()/1024/1024);
System.out.println("Trying to add 100 mb");
//100mb
byte b[] = new byte[104857600];
v.add(b);
}
} else {
//100mb
byte b[] = new byte[104857600];
v.add(b);
System.out.println("Added 100 mb");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
आदेश इसे शुरू करने के:
java -Xmx4096m MemoryEater1 3000
और उत्पादन:
total memory: 2867
max memory: 3641
free memory: 59
Trying to add 100 mb
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at MemoryEater1.main(MemoryEater1.java:18)
खैर अधिकतम स्मृति और कुल स्मृति के बीच अंतर है
यहाँ कोड है 774 एमबी, जो 100 एमबी अधिक उपभोग करने के लिए पर्याप्त होना चाहिए, लेकिन फिर भी त्रुटि है, और यहां तक कि मशीन resourc भी है एस पर्याप्त पर्याप्त हैं:
[[email protected] ~]$ free -m
total used free shared buffers cached
Mem: 15950 3447 12502 0 210 2389
-/+ buffers/cache: 847 15102
Swap: 4031 1759218603 8941
ऐसा क्यों हो सकता है?
क्या आपको नोट किया गया कि मुफ्त मेमोरी 100 एमबी से कम है? – Stephan
जब आप बड़े सरणी आवंटित करते हैं, तो आप हमेशा जेवीएम के खतरे में भाग लेते हैं, जो आपके लिए एक विशाल संगत ब्लॉक नहीं ढूंढ पाता है, भले ही कमरे छोड़ दिया जाए। –
@ स्टीफन यह केवल तभी प्रासंगिक होगा जब 'कुल स्मृति' पहले से ही 'अधिकतम स्मृति' तक विस्तारित हो। –