2011-10-18 12 views
7

मै मैक लीक इश्यू की जांच करने के लिए एक्लिप्स में मैट टूल का इस्तेमाल किया। मैंने पाया कि रिसाव मेरे ऐप में एक अज्ञात आंतरिक वर्ग उदाहरण के कारण हुआ था। MAT में प्रदर्शित वर्ग का नाम com.mycompany.myproduct.MyActivity $ 3 है। MyActivity.java में परिभाषित कई अज्ञात आंतरिक वर्ग हैं। मैं कैसे जानता हूं कि कौन सी आंतरिक कक्षा com.mycompany.myproduct.MyActivity $ 3 इंगित करता है?कक्षा के नाम से संकेतित आंतरिक अज्ञात वर्ग को कैसे पता लगाना है?

धन्यवाद।

उत्तर

4

ओरेकल कंपाइलर पर, कक्षा में होने के क्रम में उन्हें गिना जाता है। मुझे यकीन नहीं है कि यह किसी भी विनिर्देश का हिस्सा है या अन्य कार्यान्वयन के साथ संगत है।

आप कक्षा को डीकंपाइल कर सकते हैं - JD-GUI इसके लिए एक शानदार टूल है - और फिर आप देखेंगे कि आप क्या जानना चाहते हैं। आप javap -c का उपयोग करके मूल डिस्सेप्लर के साथ भी जा सकते हैं। यह आपको एक अजीब विचार देगा कि कक्षाएं कहां होती हैं।

0

अनाम कक्षाओं का पूरा बिंदु यह है कि वे बस यही हैं। जैसा कि आपने पाया है कि यह पता लगाने में आसान नहीं है कि यह किससे आया है। आम तौर पर संख्या एक से शुरू होती है, इसलिए मेरा अनुमान है कि यह तीसरी घोषित अज्ञात कक्षा होगी जो आपकी समस्या है।

इस स्थिति में, हो सकता है कि आप किसी भी अज्ञात कक्षाओं के लिए अपने कोड को दोबारा सुधारने के लिए बेहतर हो जाएं। अन्यथा मैं डीबगर को जोड़ने और कोड को चरणबद्ध करने का सुझाव देता हूं।

1

जब आप अपने कोड को सुरक्षित रूप से संकलित करते हैं तो आपके पास MyActivity $ 1.class, MyActivity $ 2.class, MyActivity $ 3.class, और इसी तरह है। अपवाद फेंकने वाली अनामिक कक्षा की पहचान करने के लिए आप जावा डीकंपलर (अपने .class पर) का उपयोग कर सकते हैं।

4

संकेत: डीबगर किसी भी तरह से जानता है कि कौन से वर्ग हैं। तो आप भी कर सकते हैं!

दो गुमनाम वर्गों के साथ इस उदाहरण पर javap उपयोग करके देखें:

import java.util.*; 

public class Test { 
    public static void main(String [] args) { 
     Map m = new HashMap(){{System.out.print(1);}}; 
     Map m1 = new HashMap(){{System.out.print(2);}}; 
    } 
} 

यह संकलित करें और चलाने के javap -c -l:

$ javap -c -l Test 
Compiled from "Test.java" 
public class Test extends java.lang.Object{ 
public Test(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

    LineNumberTable: 
    line 3: 0 



public static void main(java.lang.String[]); 
    Code: 
    0: new #2; //class Test$1 
    3: dup 
    4: invokespecial #3; //Method Test$1."<init>":()V 
    7: astore_1 
    8: new #4; //class Test$2 
    11: dup 
    12: invokespecial #5; //Method Test$2."<init>":()V 
    15: astore_2 
    16: return 

    LineNumberTable: 
    line 5: 0 
    line 7: 8 
    line 9: 16 



} 

आप देख सकते हैं, प्रथम श्रेणी के नाम Test$1 मिला है, दूसरा एक - Test$2। उम्मीद है कि टैट मदद करता है।

अधिक विशिष्ट जानकारी के लिए, आप रुचि रखने वाले विशिष्ट वर्गों को कम करें, उदा। javap -c -l Test\$2। रेखा संख्याओं पर ध्यान दें: वे आपको एक संकेत देंगे कि स्रोत फ़ाइल में कक्षा को परिभाषित किया गया था।

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