亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JVM 數組可以重新分配()嗎?

JVM 數組可以重新分配()嗎?

慕村225694 2022-12-15 16:41:50
所以 C 語言有一個realloc()程序可以用來就地增加分配的 [edit]內存。JVM/Java 是否存在等效概念?為Arrays還是nio.Buffers?我不介意這是 JDK 的一部分還是作為外部庫,例如sun.unsafe.
查看完整描述

1 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

首先,C 函數realloc不是可以增長數組的工具,而是以前通過、分配malloccallocrealloc的內存。相反,C 數組可能位于堆棧或靜態內存區域,甚至可能嵌入更大的結構中。

然后,該函數具有使原始指針無效free并返回新指針的語義。所以如果你有指針的副本到處亂飛,你有責任用新指針替換所有出現的地方。

當然,Java 不支持無效引用。保證每個非null對象引用的有效性,是 Java 內存管理的基本屬性。

所以如果你想要 C's 的等價物realloc,你必須使用指針而不是數組。然后sun.misc.Unsafe有所有相關操作

  • public long allocateMemory(long bytes)

  • public long reallocateMemory(long address, long bytes)

  • public void freeMemory(long address)

  • public float getXyz(long address)1

  • public void putXyz(long address, xyz x)1

1 其中“xyz”代表原始類型

如果要調整數組大小,請使用

array = Arrays.copyOf(array, newSize);

這不會使舊引用失效,因此如果您無法替換對舊數組的所有引用,使用這些舊引用的代碼將訪問舊數組。

但是,如果array是對特定數組的唯一引用,或者您的代碼確實替換了所有現有引用,那么理論上JVM可能會啟用就地調整大小操作而不是復制內容,另請參見Does Java JIT cheat when running JDK code?

但是檢查必要的先決條件可能比復制數組內容更昂貴。我可以想象適用性的唯一場景是,如果數組是同一線程分配的最后一個對象,那么可以證明引用還沒有逃逸,并且在分配空間中數組后面沒有對象。

對于具有這種優化的 JVM,當重復添加到 時,您可能會自動獲得好處ArrayList,因為該類確保它是對其內部數組的引用的唯一持有者,并且它在Arrays.copyOf內部用于調整大小。


查看完整回答
反對 回復 2022-12-15
  • 1 回答
  • 0 關注
  • 66 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號