2011-02-08 9 views
5

मेरे पास एक प्रोग्राम है जो अंततः OutOfMemory उत्पन्न करना चाहिए तो जावा डंप उत्पन्न करें। कार्यक्रम कोड है:जब आउटऑफमेमरी

public class VeryLargeObject implements Serializable { 
    public static final int SIZE = 1 << 12; 

    public String tag; 
    public int[][] bigOne = new int[SIZE][SIZE]; 

    { 
     // Initialize bigOne 
     for(int i = 0; i < SIZE ; ++i) { 
      for(int j = 0; j < SIZE; ++j) { 
       bigOne[i][j] = (int) (Math.random() * 100); 
      } 
     } 
    } 

    public VeryLargeObject(String tag) { 
     this.tag = tag; 
    } 

    public static void main(String args[]) { 
     VeryLargeObject[] vla = new VeryLargeObject[1 << 12]; 
     for(int i = 0; i < Integer.MAX_VALUE; ++i) { 
      vla[i] = new VeryLargeObject("aa"); 
     } 
    } 
} 

मैं निम्नलिखित मानकों के साथ कार्यक्रम चलाने:

java VeryLargeObject -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="D:\workspace" 

कार्यक्रम OutOfMemory के साथ विफल हो लेकिन कोई डंप फ़ाइल उत्पन्न होता है। क्या आपको कोई विचार है क्यों?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at VeryLargeObject.<init>(VeryLargeObject.java:14) 
     at VeryLargeObject.main(VeryLargeObject.java:32) 
+3

नहीं क्या आप कहने का मतलब था कि ढेर फ़ाइल उत्पन्न नहीं हुई? और यह नहीं होना चाहिए -XX: -HeapDumpOnOutOfMemoryError के बजाय त्रुटि: + HeapDumpOnOutOfMemoryError (+ संकेत देखें) – CoolBeans

+0

> प्रोग्राम OutOfMemory के साथ विफल रहता है लेकिन फ़ाइल उत्पन्न होने पर अब डंप करें। - क्या यह एक टाइपो है? - क्या आपका मतलब ** अब ** या ** नहीं ** है? – Ralph

उत्तर

8

स्टार्टर के लिए छोड़ XX विकल्प और कोई विकल्प पहले VeryLargeObject, अन्यथा आप जावा प्रोग्राम में पैरामीटर पास करते हैं और JVM

+0

मुझे VeryLargeObject के लिए कोई दस्तावेज नहीं मिला है, क्या आप हमें कुछ प्रामाणिक लिंक दे सकते हैं। – Vipin

+0

@Vipin, 'VeryLargeObject' कक्षा है जिसमें मुख्य (स्ट्रिंग []) 'है। सवाल खुद को देखो। – bestsss

+0

मैंने इसे नोटिस नहीं किया, ठीक है अब मुझे मिल गया :) – Vipin

5

मुझे लगता है JVM पथ पर लिख नहीं और चुपचाप विफल रहता है हो सकता है। उदाहरण के लिए, यह एक निर्देशिका में एक फ़ाइल नाम होना चाहिए जो मौजूद है। यदि आपके पास निर्देशिका D:\workspace है तो यह असफल हो जाएगी। यदि आपके पास D:\workspace\heap.hprof है तो यह काम कर सकता है। यह देखने के लिए कि आप यह कर सकते हैं, पहले उस नाम की रिक्त फ़ाइल बनाने का प्रयास करें।

+1

मेरे लिए 25 सेकंड तेज से – Ralph

+1

पैरामीटर गुम हो गए हैं – bestsss

14

समस्या यह है कि -XX:HeapDumpPath एक फ़ाइल को नमूना देता है और पथ नहीं।

-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="c:\temp\dump2.hprof" 

कहा: ताकि आप दोनों "त्रुटियों" ठीक करने के लिए की जरूरत है

और bestsss, सही भी है:

java -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="c:\temp\dump2.hprof" VeryLargeObject 
+3

'-XX: हीपडंपपाथ' भी एक रास्ता हो सकता है: '-XX: हीपडंपपाथ = सी: /', जो पैटर्न के साथ डंप उत्पन्न करेगा "java_pid4128 .hprof "ड्राइव सी रूट की मूलभूत सीमा में: –

संबंधित मुद्दे