2011-10-18 11 views
7

Utilicé la herramienta MAT en Eclipse para investigar un problema de pérdida de memoria. Descubrí que la fuga fue causada por una instancia de clase interna anónima en mi aplicación. El nombre de clase que se muestra en MAT es com.mycompany.myproduct.MyActivity $ 3. Hay muchas clases internas anónimas definidas en MyActivity.java. ¿Cómo sé cuál clase interna com.mycompany.myproduct.MyActivity $ 3 indica?cómo averiguar qué clase anónima interna indica un nombre de clase?

Gracias.

Respuesta

4

En el compilador de Oracle, están numerados por orden de aparición en la clase. No estoy seguro de si eso forma parte de alguna especificación o es coherente con otras implementaciones.

Puede descompilar la clase-- JD-GUI es una gran herramienta para eso, y luego verá lo que quiere saber. Incluso podría ir con el desmontaje básico usando javap -c. Te dará una idea aproximada de dónde ocurren las clases.

0

El objetivo de las clases anónimas es que son solo eso. Como has descubierto, no es fácil averiguar de dónde viene. Por lo general, la numeración comienza en uno, así que supongo que será la tercera clase anónima declarada que es tu problema.

En esta situación, quizás sea mejor que refactorice su código para no tener clases anónimas. De lo contrario, sugiero unir el depurador e introducir el código.

1

Cuando compila su código de forma segura, tiene MyActivity $ 1.class, MyActivity $ 2.class, MyActivity $ 3.class, y así sucesivamente. Puede usar un descompilador de Java (sobre su clase) para identificar la clase anonymus que arroja la excepción.

4

Sugerencia: depurador de alguna manera sabe qué clases están donde. ¡Así que tú también puedes!

Intente utilizar javap en este ejemplo con dos clases anónimas:

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);}}; 
    } 
} 

Compilar y ejecutar 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 



} 

Como se puede ver, la primera clase tiene nombre Test$1, el segundo - Test$2. Hope tat ayuda.

Para obtener información más específica, descompile las clases específicas que le interesen, p. javap -c -l Test\$2. Preste atención a los números de línea: le darán una pista sobre en qué parte del archivo fuente se definió la clase.

Cuestiones relacionadas