簡體   English   中英

我正在嘗試加載500Mb文件(Files.readAllBytes),並且我需要大於2 Gb的堆大小。 為什么?

[英]I'm trying to load 500Mb file (Files.readAllBytes) and I need more than 2 Gb Heap size. Why?

我正在嘗試在內存(Files.readAllBytes)中加載500Mb文件,並且我需要大於2 Gb的堆大小。

使用默認設置,我有OutOfMemoryError:Java堆空間。 當我設置-Xmx1000m時,它不起作用。 僅當我設置至少-Xmx2300m -Xmx2300m時,它才有效。 為什么Java需要這樣的開銷?

我想到了兩個可能的答案:

  1. 您正在使用的庫調用將緩沖區之間的字節復制一次以上,從而有效地增加了所需的內存量。
  2. 堆分為邏輯部分(世代)。 當分配一個不適合一代人使用的“大”對象時,該對象將盡早使用。 如果舊一代中沒有空間,則對象分配將失敗。 將此與上面的1結合起來,再放一個小堆,就可以看到Java如何遇到麻煩。

解決這兩個問題的最簡單方法是改為對文件進行內存映射 ,這將在堆外分配內存,並且非常有效/快速地讀取文件,因為它減少了讀取文件時涉及的OS上下文切換和字節緩沖區副本的數量。 。

暫無
暫無

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

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