Java重的数据内存分配
1、java中常见的一类问题是数据如何存储,存储在何处,一般想来大家都会说数据存储在内存中,对于这个观点这是必须的,但是在内存中,是否还会存在其他的存储模块呢?当然这也是必须的,内存分配是数据管理的一大重头戏,下面就我的一点观点。
2、对于一段运行着的代码,内存是如何分配,如何管理数据的,这是我们必须要理解的一个问题,不然对于一些问题我们根本无法做出正确的判断;
3、
这是一段再简单不过的程序了(Student类未书写出来),试问上面的五条输出语句会得倒什么样的输出结果:
可以看出a和stu1的值没有发生变化,但是stu2的值却发生了变化这里就存在一个数据存储的问题,当然这里也设及了内存中堆和栈这两个概念,当我们了解了堆和栈的数据存储方式之后,对于这个结果我们就会一目了然了;
4、堆和栈:
4.1、既然存在堆和栈这两个概念,那么究竟什么存放在堆中什么存放在栈中
呢?
4.2、变量都存放在栈中,至于由Interger,String(并不是所有的类类型实现了常
量池技术,列入Double。。) 等类类型定义的常变量的值则是存放在堆中
的常量池中,至于方法的调用则存放在栈中,这就形成了一个压栈和出栈
的问题;
4.3、至于对象一般存放在堆中,一旦创建一个对象,那么在堆中就会为其开辟
一块区间让其存放数据
4.4、既然是存储数据问题,那么就存在着数据溢出问题,那么什么时候会出现
堆溢出,什么时候会出现栈溢出呢?
4.5、一般来说出现栈溢出的一个经典例子就是死递归,而堆溢出一般来说,举
一个很简单的例子,就是创建很多个对象,创建相对应多的线程,让对象在
线程中待一段时间,这样就会出现堆溢出,当然对于为什么要创建多个线
程,其实对于一个对象来说,如果说只是无限制的创建对象但是从来不使用
它的话,那么这个被创建的对象就会立即被垃圾回收机制给回收了,那么他
的内存也就释放了,这样是不会出现堆溢出现象的。
4.6、下面看一组代码就栈溢出问题:
5、对第一段代码,以图示表示其运行状态:
6、通过上图的分析就能很容易的得出开始的结论a和Stu1的值没变而Stu2的值发
生了变化。