我在Eclipse中使用MAT工具來調查內存泄漏問題。我發現泄漏是由我的應用程序中的匿名內部類實例引起的。 MAT中顯示的類名是com.mycompany.myproduct.MyActivity $ 3。在MyActivity.java中定義了許多匿名內部類。我如何知道哪些內部類com.mycompany.myproduct.MyActivity $ 3表示?如何找出類名所表示的內部匿名類?
謝謝。
我在Eclipse中使用MAT工具來調查內存泄漏問題。我發現泄漏是由我的應用程序中的匿名內部類實例引起的。 MAT中顯示的類名是com.mycompany.myproduct.MyActivity $ 3。在MyActivity.java中定義了許多匿名內部類。我如何知道哪些內部類com.mycompany.myproduct.MyActivity $ 3表示?如何找出類名所表示的內部匿名類?
謝謝。
在Oracle編譯器上,它們按照類中出現的順序編號。我不確定這是否是任何規範的一部分,或與其他實現一致。
您可以反編譯該類 - JD-GUI是一個很好的工具 - 然後你會看到你想知道的。你甚至可以使用javap -c
進行基本的拆卸。它會給你一個關於班級在哪裏出現的粗略想法。
匿名類的重點在於它們就是這樣。正如你發現不容易找出它來自哪一個。通常編號從一開始,所以我的猜測是它將是您的問題的第三個聲明的匿名類。
在這種情況下,您可能最好重構代碼以避免使用任何匿名類。否則,我建議附加調試器並逐步執行代碼。
當您安全地編譯您的代碼時,您有MyActivity $ 1.class,MyActivity $ 2.class,MyActivity $ 3.class等等。您可以使用Java反編譯器(通過.class)來識別拋出異常的anonymus類。
提示:調試器以某種方式知道哪些類是哪裏。所以你也可以!
嘗試在這個例子中使用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 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
。注意行號:他們會給你提示類文件在源文件中的定義。