2012-12-14 11 views
6

मेरे पास मेरे कोड पर एक संभावित मेमोरी लीक है और मैं समाधान खोजने की कोशिश कर रहा हूं। मैं एंड्रॉइड ढांचे के लिए वसंत का उपयोग कर रहा हूँ। और अधिक विशिष्टमेमोरी लीक, एंड्रॉइड के लिए वसंत

RestTemplate.exchange(); 

फ्लाई बाध्यकारी बनाने के लिए। हालांकि, जब मैं एक स्मृति विश्लेषण करता हूं तो मुझे निम्न मिलता है:

1.628 "com.products.Product" के उदाहरण, "dalvik.system.PathClassLoader @ 0x43692b80" द्वारा लोड किया गया 1.363.064 (22,20%) बाइट्स पर कब्जा । इन उदाहरणों को "java.lang.Object []" के एक उदाहरण से संदर्भित किया गया है, जो "" द्वारा लोड किया गया है। डोमिनेटर पेड़ निम्नलिखित है:

कक्षा com.products.ProductList @ 0x436d7ea8 सिस्टम क्लास | 1.628 | 8 | 130.240 | 8

mFilteredProducts java.util.ArrayList @ 0x43a4eab0 | 1.628 | 24 | 130.240 | 6,552

सरणी java.lang.Object [1628] @ 0x43bdc888 | 1.628 | 6.528 | 130.240 | 6,528

[274] com.products.Product @ 0x4398b038 | 1 | 80 | 80 | 760

[1175] com.products.Product @ 0x43b26868 | 1 | 80 | 80 | 808

........

ऊपर एक dominator पेड़ है। हालांकि मैं सोच रहा था कि कचरा कलेक्टर को सक्रिय करने का एक सुरक्षित तरीका है या नहीं।

System.gc(); 

सुरक्षित? हालांकि, क्या इस स्मृति रिसाव को रोकने का कोई तरीका है? कक्षा com.products.Product एक साधारण POJO है जो JSON फ़ील्ड को संबंधित विशेषताओं से जोड़ देगा। आम तौर पर POJO कि JSON बाध्य करने के लिए प्रयोग किया जाता है निम्नलिखित है:

@JsonIgnoreProperties(ignoreUnknown = true) //must be there all times most likely 
public class MyPojo { 

@JsonProperty("Products") 
private ArrayList<Product> products; 

public ArrayList<Product> getProducts() { 
    return products; 
} 

public void setProducts(ArrayList<Product> products) { 
    this.products = products; 
} 
} 

com.products.Product:

@JsonIgnoreProperties(ignoreUnknown = true) //must be there all times most likely 
public class Products { 

@JsonProperty 
private String prodnum; 
@JsonProperty 
private String brand; 
@JsonProperty 
private String name; 

     //get/set 
} 

उत्तर

0

कॉलिंग System.gc() सुरक्षित है। लेकिन यह आवश्यक रूप से वास्तविक कचरा संग्रह ट्रिगर नहीं करता है। इस विधि को कॉल करने से केवल कचरा संग्रह करने के लिए सभी प्रयास करने के लिए JVM सुझाता है। यद्यपि इसे मजबूर करने के लिए जावा में कोई रास्ता नहीं है।

स्मृति रिसाव के संबंध में।ProductList पर देखें, यह उन सभी वस्तुओं को क्यों पकड़ रहा है। यदि उत्पाद सूची अभी भी आपके आवेदन में कहीं से भी संदर्भित है तो उन सभी उत्पादों को जारी नहीं किया जाएगा। के रूप में @wajda पहले ही कहा

आज मैं डेस्कटॉप अनुप्रयोग के साथ इसी तरह की समस्या थी और समस्या यह है कि मैं उपयोग के बाद PreparedStatement और ResultSet वस्तुओं को बंद नहीं किया गया था

0

System.gc() सुरक्षित है। लगभग 600 प्रश्नों के बाद मैंने 256 एमबी आवंटित स्थान भर दिया। JVisualVM का उपयोग करने के बाद (आपको इसे अपने जेडीके में रखना चाहिए) और विश्लेषण करना कि क्या हो रहा है, मैंने देखा कि चार सरणी 80% स्थान ले रही हैं और वे सभी खाली थीं।

प्रत्येक उपयोग के बाद सभी JSON ऑब्जेक्ट्स को आजमाएं और बंद करें और देखें कि यह मदद करता है या नहीं।

चीयर्स

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