Java ArrayList内存问题

Nic*_*son 0 java garbage-collection memory-management

我有以下代码:

  result = binding.downloadData(sourceURLString.replace("{CAT_ID}", catId), Data.class);

  ArrayList<Data> mAllProducts = result.getProducts();
  cloneList(mAllProducts);
  System.gc();
Run Code Online (Sandbox Code Playgroud)

这是mAllProducts ArrayList的深层副本

  static List<Data> clone;
  public static void cloneList(ArrayList<Data> list) {
    clone = new ArrayList<Data>();
    for(Data item: list){ 
        clone.add(new Data(item));
         }
 }
Run Code Online (Sandbox Code Playgroud)

数据构造函数:

 public Data(Data item2) {
    this.imageUrl = item2.imageUrl;
                   *
                   *
  }
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. mAllProducts是否会被垃圾收集器收集?
  2. 克隆列表是否通过值ArrayList传递?
  3. 如果第二个问题的答案是肯定的,那意味着克隆arraylist没有对内存的引用?
  4. 最后,如果第二个问题的答案是肯定的,那意味着只在系统使用的时间内留在内存中,然后将被垃圾收集?

hvg*_*des 5

1)无从知晓,你的gc调用仅仅是JVM尝试执行集合的建议.

2)Java中的所有内容都是按值传递的.

3)我不知道你的意思.但是,您的克隆(假设它为列表创建新项目,并且项目不共享对任何对象的引用)与原始列表完全分离.像int这样的原始值是不可变的,它只是你必须担心的对象实例.您似乎正在使用复制构造函数,因此请特别注意复制每个项目包含的任何对象,以及这些子项可能包含的任何项目; 你的副本需要很深.

4)我不知道你的意思.如果您没有对原件的任何引用,则下次GC运行时将有资格进行收集.