据我所知,当我们创建一个ArrayList
:
ArrayList<String> list = new ArrayList<String>(SIZE);
JVM为它预留内存的连续部分 https://stackoverflow.com/q/5411095/1021970。当我们向列表中添加新元素时,当元素数量达到列表的 75% 时SIZE
它保留新的、连续的内存部分并复制所有元素。
我们的名单越来越大。我们正在添加新对象,并且必须再次重建列表。
现在会发生什么?
JVM 正在寻找连续的内存段,但没有找到足够的空间。
垃圾收集器可以尝试删除一些未使用的引用并对内存进行碎片整理。如果在此过程之后 JVM 无法为列表的新实例保留空间,会发生什么情况?
它是否使用最大可能的段创建一个新的?哪个Exception
会被抛出吗?
我读了这个问题Java:ArrayList如何管理内存 https://stackoverflow.com/q/2673398/1021970答案之一是:
引用不会占用太多空间。 https://stackoverflow.com/a/2673458/1021970但无论如何,有些空间被利用了。当数组变大时,这可能是一个问题。我们也不能忘记我们还有其他使用内存空间的东西。
如果 JVM 无法分配请求的内存量,则会抛出异常
OutOfMemoryError
就是这样。实际上JVM内存分配只有两种可能的结果:
- 应用程序被给予请求的内存量。
- JVM 抛出 OutOfMemoryError。
没有中间选项,例如一定量的内存被分配。
与以下无关数组列表,这是一个 JVM 问题。如果你问是否数组列表以某种特殊的方式管理这种情况 - 那么答案是“不,它不会”。它只是尝试分配所需的内存量,然后让 JVM 考虑其余的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)