日期:2014-05-20  浏览次数:20765 次

java 内存泄漏测试
今天看了一道面试题:java会存在内存泄漏吗?请简单描述。
答案是:会.int i1,i2; 将i1-i2 如果i1是足够大的正数,i2是足够大的负数,就会造成溢位。导致错误。 
我手痒的去测试了一下。
程序如下:

int i1=Integer.MAX_VALUE;
int i2=Integer.MIN_VALUE;
System.out.println(i1+"\t"+i2);
System.out.println(i1-i2);
int i3 = i1-i2;
System.out.println(i3);

打印结果:
2147483647 -2147483648
-1
-1
我试着将i2-1 得到的值是2147483647 。
出于上面的测试我有以下疑问:
1. 网上的答案是不是有问题或者我的案例写得有问题
2. 据我所知内存溢出是因为jvm已经没有空间再装对象了才会出现内存溢出,两个值的运算为什么会造成内存溢出
3. -2147483648-1 为什么会得到2147483647

------解决方案--------------------
引用:
今天看了一道面试题:java会存在内存泄漏吗?请简单描述。
答案是:会.int i1,i2; 将i1-i2 如果i1是足够大的正数,i2是足够大的负数,就会造成溢位。导致错误。 
我手痒的去测试了一下。
程序如下:
Java code?123456int i1=Integer.MAX_VALUE;int i2=Integer.MIN_VALUE;System.ou……

什么叫内存溢出:
  通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。
楼主的案例只是简单的计算溢出,并非内存溢出!
至于3. -2147483648-1 为什么会得到2147483647 
转换为补码运算
 10000000000000000000000000000000
+11111111111111111111111111111111
=2147483647
至于楼主想尝试java内存可以通过方法1调用方法2,方法2调用方法1
之后就


------解决方案--------------------
楼主 溢出不只是内存不够没有空间装对象 当数据对象装不下用户所要存放的数据时也会出现溢出。就像楼主提出的问题 几行代码而已 楼主可以去自己测试一下 打印结果应该是正确的 为什么会这样呢 int是整形的一种 是基本数据类型 他的最大最小值分别是 2147483647 -2147483648 当这两个数在运算时。运算结果会超出int的值域,于是便会出现溢出,但并不是没有空间来放对象了,jvm有多少空间可用跟这个没关系 这是数据类型所决定的 楼主试试用long类型变量来代替你的 i1 i2 i3,这样应该就不会导致溢出而得到正确的结果了。