java堆和栈的结构 java堆与栈的区别

  java堆与栈相信很多人都会混淆,那么应该怎样去区分呢?下面是爱华网小编为大家准备的java堆与栈的区别,希望大家喜欢!

  java堆与栈的区别

  各司其职

  最主要的区别就是栈内存用来存储局部变量和方法调用。

  而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

  独有还是共享

  栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。

  而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。

java堆和栈的结构 java堆与栈的区别

  异常错误

  如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。

  而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。

  空间大小

  栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题。

  你可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值。

  java堆与栈相关阅读

  栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

  Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和 multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事 先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较 慢。

  栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

  栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

  栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:

  int a = 3;

  int b = 3;

  编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。

  这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

  要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

  

爱华网本文地址 » http://www.aihuau.com/a/4417771/986914489.html

更多阅读

玛瑙与玉髓的区别 红玉髓和红玛瑙的区别

玛瑙与玉髓的区别——简介玉髓被称为玛瑙的姐妹玉石,相信很少人知道这一点。而我们在挑选这么玛瑙和玉髓制成的饰品的时候,该如何去区分我们看到的到底是玉髓还是玛瑙呢?下面,来介绍一下玉髓和玛瑙的区别,以便消费者朋友们更容易区分。

浅谈内存分配方式以及堆和栈的区别 栈的内存分配

对于一个程序要运行,涉及到的内存分配是一个首要问题,这里简单说一下一个简单的程序运行所涉及到的内存分配方式。另外,在数据结构中存在堆和栈的概念,栈是一种先进后出的数据结构,堆则是一种排序方式,而在内存分配中也存在堆(heap)和栈(stac

转个堆与栈的区别《程序员的自我修养》 程序员修养

转个堆与栈的区别堆和栈的区别 (转贴)非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥!堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放

多进程与多线程区别 多线程 多进程的区别

网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?答案一:1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享

声明:《java堆和栈的结构 java堆与栈的区别》为网友金蛇郎君分享!如侵犯到您的合法权益请联系我们删除