hotspot/src/share/vm/oops/typeArrayKlass.cpp
typeArrayOop typeArrayKlass::allocate(int length, TRAPS) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(log2_element_size() >= 0, "bad scale");
{- -------------------------------------------
(1) もし指定された配列長(上記の length)が 0 以上の値で, かつ
可能な最大長以下であれば(= length が typeArrayKlass::max_length() 以下であれば),
CollectedHeap::array_allocate() または CollectedHeap::large_typearray_allocate() でメモリを確保してリターンする.
(確保サイズが CollectedHeap::large_typearray_limit() を越えていれば
CollectedHeap::large_typearray_allocate() を使用し,
そうでなければ CollectedHeap::array_allocate() を使用する.)
(なお, typeArrayKlass::max_length() の値は arrayOopDesc::max_array_length() で計算されている模様.
See: arrayOopDesc::max_array_length())
---------------------------------------- -}
if (length >= 0) {
if (length <= max_length()) {
size_t size = typeArrayOopDesc::object_size(layout_helper(), length);
KlassHandle h_k(THREAD, as_klassOop());
typeArrayOop t;
CollectedHeap* ch = Universe::heap();
if (size < ch->large_typearray_limit()) {
t = (typeArrayOop)CollectedHeap::array_allocate(h_k, (int)size, length, CHECK_NULL);
} else {
t = (typeArrayOop)CollectedHeap::large_typearray_allocate(h_k, (int)size, length, CHECK_NULL);
}
assert(t->is_parsable(), "Don't publish unless parsable");
return t;
{- -------------------------------------------
(1) もし指定された配列長が 0 以上だが最大長を超えていれば, OutOfMemoryError.
---------------------------------------- -}
} else {
report_java_out_of_memory("Requested array size exceeds VM limit");
THROW_OOP_0(Universe::out_of_memory_error_array_size());
}
{- -------------------------------------------
(1) もし指定された配列長が負値であれば, java_lang_NegativeArraySizeException.
---------------------------------------- -}
} else {
THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.