`
rensanning
  • 浏览: 3548126 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38136
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607280
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682280
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89329
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:401825
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69686
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91694
社区版块
存档分类
最新评论

Java数组的长度到底能有多大?

    博客分类:
  • Java
 
阅读更多
在确保内存大小的前提下,使用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数组优化实现修改数组长度.md

    此项实现了java数组不方便使用的优化,修护了数组不可更改长度的说话,面向对象的编程思想,小小提示可以当工具类使用

    Java数组练习题(带答案).doc

    1. 错误的初始化语句是_ABD_,因为A选项字符串长度超过数组长度,B选项同样如此,D选项字符数组不能直接用字符串初始化。 2. 错误的引用是_B_,因为数组下标越界。 3. 正确的二维数组初始化语句是_B_,因为A和C...

    Java数组,Java数组,多线程编程

    Java数组是程序设计中的基本构建块,它允许程序员存储多个相同类型的数据在一个单一的结构中。在Java中,数组是一种对象,它们具有固定的大小,并且一旦创建,就不能更改其长度。数组提供了通过索引来访问其元素的...

    java数组初始化详解

    Java 数组初始化详解 Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明...

    Java数组与内存控制

    ### Java数组与内存控制 #### 一、Java数组在内存分配方面的知识 ##### 1.1 数组初始化 - **声明数组的时候如何分配内存:** - 在Java中,数组的声明并不直接分配内存,而仅仅是创建了一个数组引用变量。例如: ...

    Java数组越界问题实例解析

    Java数组越界问题实例解析 在Java中,数组是一种非常重要的数据结构,它广泛应用于各种场景中。然而,在使用数组时,开发者最容易遇到的问题之一就是数组越界问题。数组越界问题是指在访问数组时,索引值超出了数组...

    5-Java数组与方法

    每个数据项都有一个唯一的索引,从0开始,到数组长度减1。例如,一个整型数组int[] numbers可以存储一系列的整数,如numbers[0], numbers[1], numbers[2]等。数组的长度在创建时必须指定,且一旦定义后不可改变,这...

    java 数组 PPT

    Java数组是Java编程语言中基本的数据结构之一,它允许存储同一类型的多个元素。在本PPT中,我们将深入探讨Java数组的概念、创建、初始化、访问和操作数组的各种方法。 一、数组的概念 数组是一种线性数据结构,它将...

    java数组扩容2

    Java数组扩容的原理  1)Java数组对象的大小是固定不变的,数组对象是不可扩容的。  2)利用数组复制方法可以变通的实现数组扩容。  3)System.arraycopy()可以复制数组。  4)Arrays.copyOf()可以简便的...

    java语法\Java数组声明、创建、初始化

    Java数组是指在Java语言中可以存储多个相同类型元素的数据结构。数组是一种引用类型,它的元素可以是基本类型,也可以是对象类型。Java数组的声明、创建和初始化是Java编程中非常重要的概念。 数组声明 在Java中,...

    java数组函数(摘自JAVA编程思想)

    4. **数组长度** 要获取数组的长度,可以使用`length`属性: ```java int length = numbers.length; ``` 5. **多维数组** Java还支持多维数组,如二维数组,可以理解为数组的数组: ```java int[][] matrix ...

    java数组

    Java数组是程序设计中不可或缺的基础概念,它是一种数据结构,允许我们存储同类型的多个元素。在Java中,数组是对象,具有固定的大小,一旦创建,其长度就不能改变。本篇文章将深入探讨Java数组的各个方面,包括创建...

    java数组_java_java数组_

    Java数组是Java编程语言中的基本数据结构之一,它允许我们存储多个同类型的元素在一个单一的变量中。数组的使用在程序设计中至关重要,因为它提供了一种高效、有序的方式来管理和访问数据。下面将深入探讨Java数组的...

    java数组基础与典型应用

    - **声明与实例化**:数组声明中不能包含长度信息,因为数组长度是在实例化时由JVM根据实际需求分配的。 - **对象类型数组初始化**:对象类型的数组元素默认初始化为`null`,这意味着没有实例化任何对象,只是创建了...

    java 数组求和计算

    以上内容涵盖了Java数组求和计算的基本知识以及相关的扩展话题。理解并掌握这些知识点对于进行有效的Java编程至关重要。在实际应用中,根据具体需求,可能还需要考虑性能优化、异常处理等方面的问题。

    Java数组相关的例子代码

    5. **数组长度** `length`属性用于获取数组的长度: ```java int arrayLength = numbers.length; ``` 6. **复制数组** 使用`System.arraycopy()`方法可以复制数组: ```java int[] copy = new int[numbers...

    第03讲 JAVA数组.ppt

    声明Java数组有以下两种方式: 1. `type arrayName[];`,例如:`int intArray[];` 2. `type [ ] arrayName;`,例如:`Date dateArray[];` 创建数组有两种方式: 1. **静态初始化**:在定义数组的同时为元素分配空间...

    Java 数组练习

    Java数组是编程基础中的核心概念,它是一种存储固定数量同类型元素的数据结构。在这个"Java 数组练习"中,我们主要关注的是如何在Java中创建、初始化、操作和理解数组。下面将详细介绍Java数组的相关知识点。 1. **...

Global site tag (gtag.js) - Google Analytics