一、从存储数据来区分:

Java中的堆(Heap)是一个运行时数据区,用来存放类的对象;

栈(Stack)主要存放基本的数据类型(int、char、double等8种基本数据类型)和对象句柄(也可以理解为地址,不是对象本身);

二、适用范围区分

Java中堆(Heap)是属于进程,比如启动一个tomcat是一个进程,这个进程有一个堆;

栈(Stack)属于线程,每个请求都可以是一个线程,每个线程有一个属于自己的栈空间,所有线程公用堆(Heap)空间

三、数据结构不同

Java中堆(Heap)和数据结构(属于树结构)的堆并不是一回事。

栈,就是数据结构的栈结构,符合栈的后进先出特点

四、访问性能不同

栈的访问速度更快

五、内存回收机制不同

堆(Heap)内存通过垃圾收集器回收;

栈通过,压栈出栈,方法执行结束后,出栈完成,空间释放;

heap和stack区别(java heap和stack的区别)(1)

例子1:

以上例子中,String是一种对象,因此存放在堆中;

首先在堆中创建一个ABC字符串,然后将地址给a,然后a又将地址给了b,所以第一个输出是true;

创建c的时候,通过new关键字,又在堆中创建了一个字符串ABC,然后地址给了c,所以第二个输出是false;

这里又引出一个知识点==比较的是两个变量的实际值(句柄或者理解为地址),而不是堆中的ABC,

大家可以自己试试下面几种情况,这还会引出另外一个知识点

heap和stack区别(java heap和stack的区别)(2)