基础知识:java
关于堆和栈,堆和栈是程序运行的关键,关于堆和栈的定义和解释可自行搜索,我比较承认以程序运行过程当中他们扮演的角色做为对比的点:堆是存储的单位,而栈是程序运行时的单位。栈解决的是程序的运行问题,即程序如何运行,如何处理数据。堆解决的是存储问题,即数据存储在哪里,怎么存储。线程
程序中每启动一个线程就有一个栈与之对应。由于每一个线程执行的逻辑不一样,因此须要独立的栈来描线程如何运行。而堆是全部线程共享的。设计
栈之因此是运行时单位,主要是由于栈中保存的都是当前线程中,包括局部变量,程序运行状态和方法返回值。而堆用来存储对象信息。指针
堆和栈的关系:对象
1.从软件设计的角度看,栈表明了处理逻辑,堆表明了数据。这样分开使得处理逻辑更加清晰。分而治之的思想体现。部署
2.栈与堆的分离,使堆中的数据被多个栈共享。栈的存取速度至关快,仅次于cpu中的寄存器,可是栈的大小是有限制的,不可能过多地存储数据,堆的出现则解决了这个问题,堆中的数据能够被多个栈共享,节约了栈的空间。另外也为数据的交换提供了一种方案。基础
3.栈是运行时单位,也就是随着程序运行,程序进行系统上下文切换时都须要对地址段进行划分,因为栈是向上增加的,就会限制栈存储内容的能力。而堆能够动态增加,栈只要记录一下堆中的地址。变量
4.面向对象就是堆和栈的优点互补。面向对象程序和结构化程序的运行基本是同样,只是面向对象的思考方式更接近天然思考的方式。好比java中的一个类的对象,对象的属性就是数据,对象的方法就是逻辑。属性保存在堆里,而方法保存在栈中。软件
堆中存储对象,栈中存储的是基本数据类型和对象引用。搜索
java中传递参数究竟是值传递仍是引用传递呢?
java中没有指针的概念,程序永远是在栈中运行的,所以在参数传递的时候,只能是值传递,即传递基本数据类型和对象引用,不会直接传递对象。
基本数据类型的传递和对象引用的传递都是传值。
堆和栈中,栈是程序运行的最根本的东西。程序能够没有堆,可是不能没有栈。堆是为栈服务的,堆里存储的数据,就是用来被全部的栈共享的。
在java中,能够经过-Xss来设置栈的大小。若是栈中存储的数据过多,就会报出java.lang.StackOverflowError。因此在部署线上应用前,请根据实际情形适当调整栈大小。