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

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数组扩容2

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

    java 数组的长度.txt

    java 数组的长度

    java数组扩容

    打破数组的固定长度局限性!使之逻辑延长

    Java数组使用的例子

    Java数组在Java虚拟机(JVM)和Java类库中是一个内置的数据结构,因此其源代码并不直接存在于Java的源代码库中。然而,你可以通过Java的API文档来理解数组的行为和特性。 在Java中,数组是一个对象,它保存了一个...

    Java数组讲解

    //注意静态初始化时,不需要指定数组的长度 //通过foreach循环遍历, 增强的for循环 for( int x : data ){ System.out.println( x ); } //也可以直接调用Arrays工具类toString()把数组的元素转换为字符串 System....

    java数组相关知识点.zip

    java数组 Java数组是Java编程中的一个核心概念,它是用于存储一系列同类型数据的数据结构。在Java中,数组是一个引用数据类型,可以存储基本数据类型(如int、char、double等)或对象类型的元素。数组在Java中扮演着...

    JAVA数组基础教程完整版

    java数组 Java 语言中提供的数组是用来存储固定大小的同类型元素。 如:可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量...本资源是java数组基础教程,适合自学的朋友,有兴趣可以下载学习参考。

    java拼接字节数组轻量高效实现Mybytes

    自定义byte数组,可变长度,轻量高效,解决集合存储简单数据的包装问题,自增缓存减少运算,方便多次调用,非线程同步

    在键盘输入数组长度和元素个数,实现冒泡排序.TXT

    这个c/c++小程序的功能是可以让用户从键盘输入数组长度和元素个数, 实现数组元素从大到小,或者从小到大排序,实现冒泡排序的算法.主要涉及到的c/c++的语法有数组/动态内存分配等语法

    面试题涵盖Java数组常见操作和用法

    本文将介绍Java数组的常见操作和用法,包括数组的声明、创建、初始化、访问、遍历等。我们还会讨论数组的长度、数组的最大值和最小值、数组的排序和反转、数组的比较和转换等常见操作。此外,我们还会探讨多维数组的...

    Java array 数组用法源码集.rar

    Java array 数组用法源码集,比如测试数组、划分成绩等级、从方法中返回数组、二分查找法、求二维数组的长度、锯齿数组、处理二维数组等,相信通过这些基础的数组操作实例,会对你了解Java中的数组有很好的帮助作用...

    2024年Java数组完全解析(干货满满).zip

    无论你是刚开始学习编程,还是已经有一定基础但想深入了解Java数组,这篇文章都能为你提供清晰、易懂的指导和帮助。 【使用场景及目标】 文章适用于任何希望学习和掌握Java数组的学习场景。通过阅读,你将能够理解...

    访问数组-java

    编写一个程序,允许用户向一个大小为10的数组输入整型值。程序应通过索引,或者通过指定一个大于0的值来查找数字元素,从而获取数组中的值。程序应处理任何在向数组输入数值或访问数组元素时发生的异常。此外,程序...

    java 数组详解

    有关java中数组的详细介绍 有详细例子

    二维数组排序

    public class Test { // 二维数组冒泡排序 public static void main... //一维数组的长度(二维数组的列*宽) System.out.println("原始二维数组:"); //打印原始二维数组 for(i=0;i;i++) { for(j=0;j;j++) {

    Java基础复习day03数组

    数组 的定义,创建,访问,长度属性,遍历,常用Arrays类 二维数组,方法递归调用经典案例 变量源码教程

    Java 实例 - 获取二维数组长度源代码-详细教程.zip

    Java 实例 - 获取二维数组长度源代码-详细教程.zip

    java字符串数组的增删改查

    利用java字符串进行增删改查 实现的超市管理系统,。(动态增加数组长度和动态增加字符串数组长度)

    Java中动态地改变数组长度及数组转Map的代码实例分享

    主要介绍了Java中动态地改变数组长度及数组转map的代码分享,其中转Map利用到了java.util.Map接口,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics