`
张麟熠焰
  • 浏览: 15757 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

堆和栈小知识

阅读更多

              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的值发

      生了变化。

 

 

  • 大小: 34.4 KB
  • 大小: 3.1 KB
  • 大小: 18.3 KB
  • 大小: 17.9 KB
  • 大小: 36.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics