在确保内存大小的前提下,使用Oracle的Java VM,以下代码肯定会报错:
int[] max = new int[Integer.MAX_VALUE];
错误信息是:
引用
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
注意这里的错误信息不是“java.lang.OutOfMemoryError: Java heap space”,意思是申请的数组大小已经超过堆大小。详细参考官方说明:
http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/memleaks.html#gbyvi。根据
Java语言规范,数组下标可以使用0 到 Integer.MAX_VALUE (=0x7fffffff) ,可以使用不代表一定能够使用,要看OS、Java VM能生成到多大。
从
https://jdk7.java.net/source.html下载Java VM源代码 openjdk-7u40-fcs-src-b43-26_aug_2013.zip
\openjdk\hotspot\src\share\vm\oops\arrayKlass.cpp(150):
objArrayOop arrayKlass::allocate_arrayArray(int n, int length, TRAPS) {
if (length < 0) {
THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
}
if (length > arrayOopDesc::max_array_length(T_ARRAY)) {
report_java_out_of_memory("Requested array size exceeds VM limit");
JvmtiExport::post_array_size_exhausted();
THROW_OOP_0(Universe::out_of_memory_error_array_size());
}
// ......
}
\openjdk\hotspot\src\share\vm\oops\arrayOop.hpp(109):
// Return the maximum length of an array of BasicType. The length can passed
// to typeArrayOop::object_size(scale, length, header_size) without causing an
// overflow. We also need to make sure that this will not overflow a size_t on
// 32 bit platforms when we convert it to a byte size.
static int32_t max_array_length(BasicType type) {
assert(type >= 0 && type < T_CONFLICT, "wrong type");
assert(type2aelembytes(type) != 0, "wrong type");
const size_t max_element_words_per_size_t =
align_size_down((SIZE_MAX/HeapWordSize - header_size(type)), MinObjAlignment);
const size_t max_elements_per_size_t =
HeapWordSize * max_element_words_per_size_t / type2aelembytes(type);
if ((size_t)max_jint < max_elements_per_size_t) {
// It should be ok to return max_jint here, but parts of the code
// (CollectedHeap, Klass::oop_oop_iterate(), and more) uses an int for
// passing around the size (in words) of an object. So, we need to avoid
// overflowing an int when we add the header. See CRs 4718400 and 7110613.
return align_size_down(max_jint - header_size(type), MinObjAlignment);
}
return (int32_t)max_elements_per_size_t;
}
\openjdk\jdk\src\share\native\common\sizecalc.h(41):
#include <stdint.h> /* SIZE_MAX for C99+ */
/* http://stackoverflow.com/questions/3472311/what-is-a-portable-method-to-find-the-maximum-value-of-size-t */
#ifndef SIZE_MAX
#define SIZE_MAX ((size_t)-1)
#endif
32位系统中size_t是4字节的,在64位系统中,size_t是8字节的。
Java 7 Update 40(Windows)测试结果是:
引用
32bit的Java VM: 0x3fffffff - 3 (= 1,073,741,820)
64bit的Java VM: 0x7fffffff - 2 (= 2,147,483,645)
分享到:
相关推荐
此项实现了java数组不方便使用的优化,修护了数组不可更改长度的说话,面向对象的编程思想,小小提示可以当工具类使用
1. 错误的初始化语句是_ABD_,因为A选项字符串长度超过数组长度,B选项同样如此,D选项字符数组不能直接用字符串初始化。 2. 错误的引用是_B_,因为数组下标越界。 3. 正确的二维数组初始化语句是_B_,因为A和C...
Java数组是程序设计中的基本构建块,它允许程序员存储多个相同类型的数据在一个单一的结构中。在Java中,数组是一种对象,它们具有固定的大小,并且一旦创建,就不能更改其长度。数组提供了通过索引来访问其元素的...
Java 数组初始化详解 Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明...
### Java数组与内存控制 #### 一、Java数组在内存分配方面的知识 ##### 1.1 数组初始化 - **声明数组的时候如何分配内存:** - 在Java中,数组的声明并不直接分配内存,而仅仅是创建了一个数组引用变量。例如: ...
Java数组越界问题实例解析 在Java中,数组是一种非常重要的数据结构,它广泛应用于各种场景中。然而,在使用数组时,开发者最容易遇到的问题之一就是数组越界问题。数组越界问题是指在访问数组时,索引值超出了数组...
每个数据项都有一个唯一的索引,从0开始,到数组长度减1。例如,一个整型数组int[] numbers可以存储一系列的整数,如numbers[0], numbers[1], numbers[2]等。数组的长度在创建时必须指定,且一旦定义后不可改变,这...
Java数组是Java编程语言中基本的数据结构之一,它允许存储同一类型的多个元素。在本PPT中,我们将深入探讨Java数组的概念、创建、初始化、访问和操作数组的各种方法。 一、数组的概念 数组是一种线性数据结构,它将...
Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组对象是不可扩容的。 2)利用数组复制方法可以变通的实现数组扩容。 3)System.arraycopy()可以复制数组。 4)Arrays.copyOf()可以简便的...
Java数组是指在Java语言中可以存储多个相同类型元素的数据结构。数组是一种引用类型,它的元素可以是基本类型,也可以是对象类型。Java数组的声明、创建和初始化是Java编程中非常重要的概念。 数组声明 在Java中,...
4. **数组长度** 要获取数组的长度,可以使用`length`属性: ```java int length = numbers.length; ``` 5. **多维数组** Java还支持多维数组,如二维数组,可以理解为数组的数组: ```java int[][] matrix ...
Java数组是程序设计中不可或缺的基础概念,它是一种数据结构,允许我们存储同类型的多个元素。在Java中,数组是对象,具有固定的大小,一旦创建,其长度就不能改变。本篇文章将深入探讨Java数组的各个方面,包括创建...
Java数组是Java编程语言中的基本数据结构之一,它允许我们存储多个同类型的元素在一个单一的变量中。数组的使用在程序设计中至关重要,因为它提供了一种高效、有序的方式来管理和访问数据。下面将深入探讨Java数组的...
- **声明与实例化**:数组声明中不能包含长度信息,因为数组长度是在实例化时由JVM根据实际需求分配的。 - **对象类型数组初始化**:对象类型的数组元素默认初始化为`null`,这意味着没有实例化任何对象,只是创建了...
以上内容涵盖了Java数组求和计算的基本知识以及相关的扩展话题。理解并掌握这些知识点对于进行有效的Java编程至关重要。在实际应用中,根据具体需求,可能还需要考虑性能优化、异常处理等方面的问题。
5. **数组长度** `length`属性用于获取数组的长度: ```java int arrayLength = numbers.length; ``` 6. **复制数组** 使用`System.arraycopy()`方法可以复制数组: ```java int[] copy = new int[numbers...
声明Java数组有以下两种方式: 1. `type arrayName[];`,例如:`int intArray[];` 2. `type [ ] arrayName;`,例如:`Date dateArray[];` 创建数组有两种方式: 1. **静态初始化**:在定义数组的同时为元素分配空间...
Java数组是编程基础中的核心概念,它是一种存储固定数量同类型元素的数据结构。在这个"Java 数组练习"中,我们主要关注的是如何在Java中创建、初始化、操作和理解数组。下面将详细介绍Java数组的相关知识点。 1. **...