簡體   English   中英

Java ArrayList內存問題

[英]Java ArrayList Memory Issue

我有以下代碼:

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

  ArrayList<Data> mAllProducts = result.getProducts();
  cloneList(mAllProducts);
  System.gc();

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

數據構造器:

 public Data(Data item2) {
    this.imageUrl = item2.imageUrl;
                   *
                   *
  }

我的問題是:

  1. 垃圾收集器會收集mAllProducts數組列表嗎?
  2. 克隆列表是按值ArrayList傳遞的嗎?
  3. 如果第二個問題的答案是肯定的,那意味着克隆arraylist沒有對內存的引用嗎?
  4. 最后,如果第二個問題的答案是“是”,那么這意味着將僅在系統正在使用的時間停留在內存中,然后才會進行垃圾回收嗎?

1)沒有辦法知道,您的gc調用僅是JVM嘗試執行收集的建議。

2)Java中的所有內容都是按值傳遞的。

3)我不知道你的意思。 但是您的克隆(假設它為該列表創建了新項目,並且這些項目不共享對任何對象的引用)與原始列表完全不同。 像int這樣的原始值是不可變的,它只是您需要擔心的對象實例。 似乎您正在使用復制構造函數,因此請格外小心,復制每個項目包含的任何對象以及子項可能包含的任何對象; 您的副本需要很深。

4)我不知道你的意思。 如果您沒有對原始文件的任何引用,則下次GC運行時將有資格進行收集。

垃圾收集器會收集mAllProducts數組列表嗎?

僅當1)垃圾收集器決定這樣做和2)當它超出范圍時

克隆列表是按值ArrayList傳遞的嗎?

如果第二個問題的答案是肯定的,那意味着克隆arraylist沒有對內存的引用嗎?

絕對需要引用內存中的某個點,否則就不能存在於邏輯系統(例如計算機)中。

最后,如果第二個問題的答案是“是”,那么這意味着將僅在系統正在使用的時間停留在內存中,然后才會進行垃圾回收嗎?

同樣,垃圾收集器將在認為合適的情況下進行收集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM