在写测试方法的时候,生成了一个数组,之后报了堆溢出错误,这样的报错一般来说只要有一些JVM的基础都知道要用—Xmx、-Xms来开更大的堆,接下来看看我碰到的一个堆溢出的问题

在测试代码中开了一个50000*50000的int数组报错:

@Test
public void creatMPEM() {
double packetLoss = 0.5;
int[][] test = NetworkCodeTool.creatMPEM(50000, 50000, packetLoss);
int one = 0;
int zero = 0;
double packageLossReal = 0;
for (int i = 0; i < test.length; i++) {
for (int j = 0; j < test[0].length; j++) {
int temp = test[i][j] == 1 ? one++ : zero++;
// System.out.print(test[i][j]+" ");
}
// System.out.println();
} Double sum = new Double(one + zero);
packageLossReal = one / sum;
System.out.println("期望丢包率:"+packetLoss);
System.out.println("实际丢包率:"+packageLossReal);
} public static int[][] creatMPEM(int n, int m, double packetLoss) {
if (packetLoss >= 1){ throw new RuntimeException("the packetLoss is no means");}
int[][] matrix = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
matrix[i][j] = Math.random() < packetLoss ? 1 : 0;
}
}
return matrix;
}

报错信息:

java.lang.OutOfMemoryError: Java heap space

	at com.axin.communication.tools.compute.NetworkCodeTool.creatMPEM(NetworkCodeTool.java:20)
at com.axin.communication.tools.compute.NetworkCodeToolTest.creatMPEM(NetworkCodeToolTest.java:9)

当你搜网上的解决方法时,往往就会看到说在虚拟机参数列上打上-Xms1024M,-Xmx1024M等等分配一个更大的堆空间,然而对上述的代码来说仍然会报错

其实我们遇到问题时下意识的动作就是去网上搜问题,往往没有有意识思考

实际上只要博主静下心来真正的算一算50000*50000 int数组的大小就会发现问题的所在。

计算一下50000*50000数组所占的空间:1一个int类型的数占4个字节,总共占50000*50000*4 = 10000000000 Byte ~=10G

到这我们就会发现一个不起眼的数组竟然占了这么大的空间,所以之前开的1G的堆根本是杯水车薪。如果屏幕前的你也遇到了这个问题,不妨计算一下你开的数组占了多少的空间。

Java的数组堆溢出问题的更多相关文章

  1. 实战Java虚拟机之一“堆溢出处理”

    从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...

  2. Java虚拟机六 堆溢出的处理

    在Java程序中,如果堆空间不足,有可能抛出内存溢出错误:Out Of Memory,简称OOM. Exception in thread "main" java.lang.Out ...

  3. java代码实现JVM栈溢出,堆溢出

    参考博客:http://www.cnblogs.com/tv151579/p/3647238.html 背景知识: 栈存放什么:栈存储运行时声明的变量——对象引用(或基础类型, primitive)内 ...

  4. 【java虚拟机】内存溢出与内存泄漏

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/7354857.html 一.基本概念 内存溢出:简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提 ...

  5. 写Java代码分别使堆溢出,栈溢出

    首先要搞清楚堆栈里放的什么东西: 栈存储运行时声明的变量——对象引用(或基础类型, primitive)内存空间,堆分配每一个对象内容(实例)内存空间. 一个变量可以先后指向多个对象实例:数组.链表等 ...

  6. 实战Java虚拟机之中的一个“堆溢出处理”

    从今天開始.我会发5个关于java虚拟机的小系列: 实战Java虚拟机之中的一个"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式" 实战Java虚拟机之 ...

  7. Java JVM:内存溢出(栈溢出,堆溢出,持久代溢出以及 nable to create native thread)

    转载自https://github.com/pzxwhc/MineKnowContainer/issues/25 包括:1. 栈溢出(StackOverflowError)2. 堆溢出(OutOfMe ...

  8. java内存溢出示例(堆溢出、栈溢出)

    堆溢出: /** * @author LXA * 堆溢出 */ public class Heap { public static void main(String[] args) { ArrayLi ...

  9. 使用jvisualvm.exe工具查看java项目内存溢出(堆溢出)

    在查看内存溢出的时候,我们需要明白,堆溢出和持久代溢出,他们不一样,说到内存泄漏,我们就需要明白,内存中  年老代和新生代,和持久代,这3块的数据 自己的理解: new了一个对象,会进入到堆里面,先放 ...

随机推荐

  1. vue-cli中全局组件的注册使用

    一.全局注册 在install函数中全局注册组件,没毛病,老铁. 二.其它组件调用 直接在其他  .vue组件中直接写 <popup ref="popup">,然后就可 ...

  2. windows7 资源管理器无法显示常用

    1.windows7 资源管理器无法显示常用 2.windows7 资源管理器无法附加的解决办法. 删除以下文件夹内的所有文件即可%APPDATA%\Microsoft\Windows\Recent\ ...

  3. Redis有序集合操作

    有序集合存储着成员和分值之间的映射,并且提供了分值处理命令,以及根据分值大小有序的获取或扫描成员和分值的命令 (常用命令) ZADD : ZADD key-name score member [sco ...

  4. C# serialPort的DataReceived事件无法触发 ,用的霍尼韦尔的扫码枪并且装了相应的USB转串口驱动。

    昨天想试试霍尼韦尔的扫码枪,扫码枪有两种模式,键盘模式和串口模式, 1.键盘模式直接插上就行了,就像一个键盘一样不需要任何驱动,扫出来的数据直接落到PC的输入焦点上.就像一个键盘一样,只能输入字符. ...

  5. MyBatis动态添加—trim标签

    做添加时,部分字段有值,没值的字段不添加,这就是动态添加,使用 trim 标签就可以实现. <insert id="insertSysUser" parameterType= ...

  6. Failed to unregister the JMX name: org.apache.commons.dbcp2:name=xxx,type=BasicDataSource

    把datesource的bean的class由 org.apache.commons.dbcp2.BasicDataSource 改成 org.apache.tomcat.dbcp.dbcp.Basi ...

  7. java数组创建

    java数组创建:int[] number = new int[10]; int[]:表明这是一个数组 new int[10]:给前面的数组类型的number变量分配10个int类型的空间大小

  8. oracle配置数据库可恢复性(认证系列总结一)

    原创作品,转载请注明出处:https://www.cnblogs.com/sunshine5683/p/10263246.html 接下来的n多天,将进入oracle认证系列的学习总结中,本该从asm ...

  9. 整数对(hdu1271)找规律

    整数对 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissio ...

  10. linux服务器SSH破解预防方法

    1.linux服务器通过配置 /etc/hosts.deny 禁止对方IP通过SSH登录我的服务器 vim /etc/hosts.deny 2.不用SSH服务的默认端口22,重新设置一个新端口,最好设 ...