6

我的代码可能存在内存泄漏,我正在尝试寻找解决方案。我正在使用 Spring for Android 框架。更具体的

  RestTemplate.exchange();

为了进行即时绑定。但是,当我进行内存分析时,我得到以下信息:

由“dalvik.system.PathClassLoader @ 0x43692b80”加载的“com.products.Product”的 1.628 个实例占用 1.363.064 (22,20%) 个字节。这些实例引用自“java.lang.Object[]”的一个实例,由“”加载。支配树如下:

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 类只是一个简单的 POJO,它将 JSON 字段绑定到相应的属性。一般用于绑定 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.产品:

@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 次查询之后,我填满了 256mb 的分配空间。在使用 JVisualVM(你的 JDK 中应该有它)并分析堆积的内容后,我看到 char 数组占用了 80% 的空间,而且它们都是空的。

每次使用后尝试关闭所有 JSON 对象,看看是否有帮助。

干杯

于 2013-03-14T12:22:04.993 回答