是否可以在 Java 堆的年轻区域和永久区域之间分配大型数组?
鉴于这些地区有自己的次区域,我认为我稍微简化了问题。我只是想了解一次分配是否可以跨越多个区域(年轻和终身)。如果是,那么垃圾收集是如何完成的,因为不同区域使用的策略是不同的(我认为至少在 ParallelGC 的情况下,不同的收集器用于不同的区域)。
为了让问题更清楚,这里举一个例子。假设 -Xms 和 -Xmx 设置为 900M,NewRatio(年轻区域与长期区域的比率)为 2。这将导致年轻区域为 300M,长期区域为 600M。现在,如果我尝试分配一个“新字节[750]”,那么分配会通过,因为没有一个区域可能有足够的连续空间。
我问这个问题的原因是我在分配一个大数组时遇到了问题(OutofMemoryError)(这实际上是我代码中的大部分分配),我通过更改 -XX:NewRatio 解决了这个问题。我的假设是,大型阵列肯定会进入永久区域,并且我的永久区域至少应具有阵列所需的空间。
Java 数组总是分配在连续的内存中。他们不会分开。
新对象总是在年轻代中分配,如果它们在足够的 GC 事件中幸存下来,则将其移至终身代。因此,请确保您的年轻分配足够大。
如果没有 750 字节的连续区域,您将无法让 new byte[750] 工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)