java的堆栈

来源:互联网 发布:tvbj2港台网络电视直播 编辑:程序博客网 时间:2024/06/04 00:39

在java和一些高级语言中,都有堆栈的概念,在C++等中,堆栈需要程序要自己管理。要想使用堆栈内存,首先得需要new出该内存空间,等到不用的时候,再free()掉该空间。Java和C++不同,java的堆栈是由java虚拟机来维护的。但是要想编写出高效的代码。仍然需要对java的堆栈有一定的了解。
Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
虽然一些程序员认为java里没有指针的概念,但是我感觉堆区定义的对象的首地址就可以看成是一个指针。下面就根据一些简单的demo来分析一下java的堆栈。
Java的栈:java的栈比堆区的速度快很多。在java的栈区主要存储java定义的基本数据类型和java类的引用。
比如定义一个变量 int a= 5;int b = 5 ; int c = 5;int d = 6;那么java的栈会如下。
系统会首先创建一个变量为a的引用,然后查找有没有值为5的地址,如果没找到,就会开辟一个存放值5的地址,然后将a指向值为5的地址。然后再创建变量b的引用,然后找在栈区是否有5这个值,找到了就将b指向5的地址。c也是,发现有值为5的变量,就把指针指向了5。

Int d = 6
Int c
Int b
int a = 5;
这样就出现了 a,b,c同时指向5的情况。但是这样值的引用和类的引用不同。假定两个类对象的的引用同时指定到同一个对象。如果一个对象的引用变量修改了这个对象的内部状态,那么另一个对象引用也会随着这个类的变化而变化,但是值不会发生变化。假设a的值变成了4,b和c的值不会随着a的值的变化而变化。而是先搜索栈区是否有值的4的引用,如果有就将a的指向指向该变量,如果没有就在栈区创建这个变量,再将a的引用指向该值。
堆和栈不一样,栈主要存放变量和引用,而堆主要是存放对象的。我们都知道高级程序的执行过程都是顺序执行的。而程序需要的变量都存放在栈区里。如果需要用到某个变量或者对象,java程序会去栈区搜索,如果是变量,直接在栈里就能取出使用,如果是对象,就需要根据对象存放在栈区的引用区堆去寻找真正的对象取出使用,执行的过程如下所示。
这里写图片描述
程序在运行过程中,需要的变量都会去栈里寻找,如果找到的是引用,就去堆里把真正的程序取出来执行。
这就是java堆栈的特点。

0 0
原创粉丝点击