我正在阅读有关Java ArrayList
如何发展的文档。我不明白为什么hugeCapacity(int minCapacity)
方法选择返回Integer.MAX_VALUE
或MAX_ARRAY_SIZE
。
从类MAX_ARRAY_SIZE
的定义来看,
244 | private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
它与Integer.MAX_VALUE
几乎相同,只是除了一个整数(32 bits
)的大小。
264 | private static int hugeCapacity(int minCapacity) {
265 | if (minCapacity < 0) // overflow
266 | throw new OutOfMemoryError();
267 | return (minCapacity > MAX_ARRAY_SIZE) ?
268 | Integer.MAX_VALUE :
269 | MAX_ARRAY_SIZE;
270 | }
有谁可以告诉我返回Integer.MAX_VALUE
与MAX_ARRAY_SIZE
之间的细微差别是什么?无论哪种方式,都不应该出现OutOfMemoryError
?
答案 0 :(得分:12)
最大数组大小限制为某个数字,这些数字在不同的JVM之间变化,通常略小于Integer.MAX_VALUE
。因此,即使您有足够的内存来分配Integer.MAX_VALUE
元素数组,您也会在大多数JVM上拥有OutOfMemoryError
。 MAX_ARRAY_SIZE
假定大多数现有JVM上的有效数组大小。因此,当ArrayList
大小接近Integer.MAX_VALUE
时(例如,您有超过1_500_000_000个元素且需要放大数组),它会扩大到此MAX_ARRAY_SIZE
,因此可以成功执行(MAX_ARRAY_SIZE
假设你有足够的记忆)。仅当元素数量超过ArrayList
时,Integer.MAX_VALUE
才会尝试分配MAX_ARRAY_SIZE
元素数组(在大多数JVM上可能会失败,但可能取得一些成功)。通过这种方式,您可以在几乎任何JVM上安全地添加import matplotlib.pyplot as plt
import numpy as np
mn = 10312054216.046213
mz = 91.1876
a1z = 98.330
a2z = 29.571
a3z = 8.396
b1, b2, b3 = -13/(4*pi), 19/(12*pi), 7/(2*pi)
b1p, b2p, b3p = -157/(36*pi), 11/(12*pi), 17/(6*pi)
c1, c2, c3 = 3/5, 1, 1
ms = np.linspace(100, 10e18, num = 100, endpoint = True)
def a1(ms, mn):
if (ms < mn):
return ( c1*(a1z + b1*np.log(ms/mz)) )**(-1)
if (ms >= mn):
a1n = ( c1*(a1z + b1*log(mn/mz)) )**(-1)
return ( c1*(a1n + b1p*log(ms/mn)) )**(-1)
plt.xscale('log')
plt.plot(ms, 1/a1(ms, mn))
plt.show()
之前的元素,并且只有在此之后才会出现问题。
答案 1 :(得分:2)
来自Oracle的实现(Java 8更新31):
OutOfMemoryError
他们返回(2 31 - 1) - 8 以确保他们的代码在被另一个VM实现执行时不会创建git fetch --depth=1
。