6

コードでメモリ リークが発生する可能性があり、解決策を見つけようとしています。Spring for Android フレームワークを使用しています。そしてより具体的には、

  RestTemplate.exchange();

オンザフライ バインディングを作成するため。ただし、メモリ分析を行うと、次のようになります。

「dalvik.system.PathClassLoader @ 0x43692b80」によってロードされた「com.products.Product」の 1.628 インスタンスは、1.363.064 (22,20%) バイトを占有します。これらのインスタンスは、"" によってロードされた "java.lang.Object[]" の 1 つのインスタンスから参照されます。ドミネーター ツリーは次のとおりです。

class 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

.........

上記はドミネーターツリーです。しかし、ガベージコレクターを有効にする安全な方法があるかどうか疑問に思っていました。それは

  System.gc();

安全?しかし、このメモリリークを止める方法はありますか? クラス com.products.Product は、JSON フィールドを対応する属性にバインドする単なる POJO です。通常、JSON のバインドに使用される POJO は次のとおりです。

@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
}
4

2 に答える 2

0

通話System.gc()は安全です。ただし、必ずしも実際のガベージ コレクションがトリガーされるとは限りません。このメソッドの呼び出しは、JVM がガベージ コレクションを実行するために全力を尽くすことを示唆するだけです。ただし、Java でそれを強制する方法はありません。

メモリリークについて。を見てくださいProductList。なぜこれらすべてのオブジェクトが保持されているのですか。アプリケーションのどこからでも ProductList が参照されている場合、それらの製品はすべてリリースされません。

于 2013-02-08T21:35:21.440 に答える
0

System.gc() @wajdaがすでに言ったように安全です

今日、デスクトップ アプリケーションで同様の問題が発生しました。問題は、使用後に PreparedStatement および ResultSet オブジェクトを閉じていなかったことです。約 600 回のクエリの後、256 MB の割り当てられたスペースがいっぱいになりました。JVisualVM (JDK に含まれている必要があります) を使用して積み上げられているものを分析した後、char 配列が 80% のスペースを占めていて、それらはすべて空でした。

使用するたびにすべての JSON オブジェクトを閉じてみて、それが役立つかどうかを確認してください。

乾杯

于 2013-03-14T12:22:04.993 に答える