java内存分配

来源:互联网 发布:淘宝代购兼职 编辑:程序博客网 时间:2024/04/28 09:41

      面向对象这点不陌生了,从C#,到VB.net,再到此时的Java.其中学习的概念以及思想是一致的,只不过语言的关键字不同罢了.

     但是当时的C#没有讲述数据类型在内存的分配,而在java内存分配如下.

      java中内存分为四部分:堆栈区(heap)、栈区、数据区(data)、代码区(code) 

     java数据类型有两种:一个是基本的数据类型;另一个:引用类型(除了基本数据类型)。

    基础的数据类型有四类八种:

    逻辑类型:boolean

    文本类型:char

    整数类型:byte、short、int、long

    浮点类型:float、double

 

   那数据类型在内存中的分配。

   基础数据类型和引用变量直接在栈空间分配。

   直接new出来对象和数组,则引用名在栈空间,而实际的内容分配在堆空间。

 

   那java栈和堆的区别是什么呢?

      java的堆是一个运行时数据区,类的对象存放其中,这些对象都是通过new出来滴,它们不需要显示滴释放代码。堆是由垃圾回收机制来负责的。当堆中的对象没有引用变量(即没有指向它的变量),则垃圾回收机制会释放此对象。但是,堆中的对象都是在内存中动态生成的,存取速度相对于栈而言比较慢。

      java的栈是存放基本的数据类型和引用变量,但是其中的数据大小和生存期都必须是确定的,存取速度比较快,只要超村变量的生存周期,则就会自动释放内存。

 

   其中栈有个特点是:实现数据共享。

   比如:java 定义:int a=1; 在栈中是如何实现的呢?首先在栈中创建一个a的引用,然后在栈中查询是否存在1这个数据,若是没有,则把1添加到栈中;然后a指向1.

    若是再定义int b=1;过程如下:首先在栈中创建一个b的引用,然后在栈中查询是否存在1这个数据,此时查询到已经存在1这个数据,那直接把b指向1.即a和b指向同一个区域1.

     但是若是改变a的值,即a=2;则会继续搜索栈中是否存在2这个数据,没有查询到直接把2添加到栈 中,最后改变a的指向。a指向2,但是b依然指向1.

    

     但是注意:此时的数据共享和引用变量指向同一个对象则是不同的。对于后者引用变量指向同一个对象。比如:Person类。其属性name是public则。

    Person p1=new Person();

    Person p2=p1;

     内存中如下:

   

若是改变其中一个引用变量,p1.name="abc",则p2.name=???答案肯定是abc啊。所以:引用变量指向同一个对象,若是其中一个改变,另一个肯定会改变的。但是对于栈中的数据共享(上述例子),则a的改变是不会影响b

    

原创粉丝点击