首先,自己做实验玩时,发现一个不得了的东西。
首先统一一下,int的范围是[-2^31,2^31-1]; 当不对写出的整数进行说明时,默认就是int类型。那么,在声明数组时,byte[1024*1024]
其中1024*1024默认是int类型。
下面我们进入正题:
如下,申请一个1T大的byte数组
byte[] arr =new byte[1024*1024*1024*1024];
//这里没有抛出任何错误,这个不难想吧!输出来看看就知道了
System.out.println(1024*1024*1024*1024);
//结果是0,为什么那?因为超过了int的表示范围呗。
//不行,我非要申请一个1T大的数组怎么办?突发奇想,int表示不开,使用long不行吗?
long len = 1024l*1024l*1024l*1024l
byte[] arr = new byte[len];
//嘿嘿,智障了~ 数组的声明只能是使用int
那么我们就申请在整数范围内的byte数组
byte[] arr = new byte[1024 * 1024 * 1024 * 1 ];
//申请1G的数组,哇,竟然成功了,而且经过测试,可以使用
byte[] arr2 = new byte[1024 * 1024 * 1024 * 2 -1 ];
//申请int所能表示最大的数组(2G-1B)。嗯?这次有错误了
//那我不这么弄了,我分批进行申请
byte[] arr = new byte[1024 * 1024 * 1024 * 1 ];
byte[] arr2 = new byte[1024 * 1024 * 1024 * 1 ];
//第二个数组申请出错了
话说还真有点神奇~两次的异常信息竟然是不一样的。
算了~好玩归好玩~但是,不知道是什么鬼
那么,怎么知道JVM默认的内存大小那?
作者比较笨,采用了“二分查找法”(手动二分)
(仅仅限于作者的机器上,8G内存、jdk和jre均是1.8)
byte[] arr1 = new byte[1024 * 1024 * 1024];// 1G
byte[] arr2 = new byte[1024 * 1024 * 162];//162M
//不会报错
byte[] arr1 = new byte[1024 * 1024 * 1024];// 1G
byte[] arr2 = new byte[1024 * 1024 * 163];//163M
//会报错
那么,结论就是,JVM的默认内存大小是1G+162M。(好奇怪~为什么~)
下面介绍修改JVM内存的方法
-
修改配置文件,这种方式针对所有的java程序
修改eclipse的配置文件eclipse.ini
,这个文件在eclipse的根目录下面
打开后,发现-Xms256m -Xmx1024m
先说明一下,这两个参数的作用
-Xms256m
说的是JVM启动时初始的内存大小-Xmx1024m
说的是JVM允许的最大内存* 这就使我感到奇怪的地方,为什么最大允许1G,而我能申请到1G+162M的内存。
算了,反正在这里可以修改内存的大小。
-
还有一种方法,这是针对当前要执行的java程序
Run >> Run Configurations… >> Arguments
在VM arguments中输入-Xmx2048M
上面出现的问题,目前还解决不了啊~希望dalao可以指点一二~