[Java]Stack栈和Heap堆的区别(终结篇)[转]

首先分清楚Stack,Heap的中文翻译:Stack—栈,Heap—堆。

        在中文里,Stack可以翻译为“堆栈”,所以我直接查找了计算机术语里面堆和栈开头的词语:

       堆存储: heapstorage    堆存储分配: heapstorage allocation  堆存储管理: heap storage management

        栈编址: stack addressing   栈变换:stack transformation  栈存储器:stack memory  栈单元: stack cell

 

          接着,总结在Java里面Heap和Stack分别存储数据的不同。

 

             Heap(堆)       Stack(栈)
 JVM中的功能      内存数据区                    内存指令区
 存储数据      对象实例(1)  基本数据类型, 指令代码,常量,对象的引用地址(2)

1. 保存对象实例,实际上是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在stack中)。
   
   对象实例在heap中分配好以后,需要在stack中保存一个4字节的heap内存地址,用来定位该对象实例在heap中的位置,便于找到该对象实例。

 

2. 基本数据类型包括byte、int、char、long、float、double、boolean和short。
    函数方法属于指令.

 

 =======================       

  引用网上广泛流传的“Java堆和栈的区别”里面对堆和栈的介绍;

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

        “栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 

   

         可见,垃圾回收GC是针对堆Heap的,而栈因为本身是FILO - first in, last out. 先进后出,能够自动释放。 这样就能明白到new创建的,都是放到堆Heap!

本文出自 “学习Android” 博客,请务必保留此出处http://android.blog.51cto.com/268543/50100

时间: 2024-09-10 14:34:36

[Java]Stack栈和Heap堆的区别(终结篇)[转]的相关文章

JAVA Stack栈和Heap堆的区别(转)

      首先分清楚Stack,Heap的中文翻译:Stack-栈,Heap-堆.         在中文里,Stack可以翻译为"堆栈",所以我直接查找了计算机术语里面堆和栈开头的词语:        堆存储: heapstorage    堆存储分配: heapstorage allocation  堆存储管理: heap storage management         栈编址: stack addressing   栈变换:stack transformation  栈存

c语言stack(栈)和heap(堆)的使用详解_C 语言

一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)-由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap)-一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收.注意它与数据结构中的堆是两回事,分配方式倒是类似于链表.3.全局区(静态区)(static)-全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另

深度剖析Java变量栈&对象堆

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中

关于c++堆栈与java堆的区别

问题描述 关于c++堆栈与java堆的区别 最近看java编程思想 看到这样一句话:"在Java中,所有对象都必须在内存"堆"里创建.而在C++中,对象是在堆栈中创建的.这样可达到更快的速度,"这句话不能理解.c++的堆栈和java的堆有啥区别啊. PS:原文"最重要的一种情况是C和C++对内存的管理方式,它是某些人觉得Java速度肯定慢的重要依据:在Java中,所有对象都必须在内存"堆"里创建.而在C++中,对象是在堆栈中创建的.这样

java中栈Stack类操作

/** * Stack类 * 栈:桶型或箱型数据类型,后进先出,相对堆Heap为二叉树类型,可以快速定位并操作 * Stack<E>,支持泛型 * public class Stack<E> extends Vector<E> * Stack的方法调用的Vector的方法,被synchronized修饰,为线程安全(Vector也是) * Stack methods: * push : 把项压入堆栈顶部 ,并作为此函数的值返回该对象 * pop : 移除堆栈顶部的对象,

关于java stack压栈出错

问题描述 关于java stack压栈出错 public class ReverseString { Stack word; Stack sentence; public void reverse(String sentence){ for(int i=0; i<sentence.length(); i++){ char n =sentence.charAt(i); if(n!=' '){ word.push(n); }else{ while(!word.empty()){ this.sente

java有栈,堆,常量池,除了这三个还有哪些域,他们的统称是什么?

问题描述 java有栈,堆,常量池,除了这三个还有哪些域,他们的统称是什么? java有栈,堆,常量池,除了这三个还有哪些域,他们的统称是什么? java有栈,堆,常量池,除了这三个还有哪些域,他们的统称是什么? java有栈,堆,常量池,除了这三个还有哪些域,他们的统称是什么? 解决方案 还有个叫全局数据区,统称为内存 解决方案二: http://www.cnblogs.com/dingyingsi/p/3760447.html 堆 栈 本地方法区(常量池是其中一部分) 计数器 本地方法栈(调

Java的封装类型和原始类型的区别?那种性能好?

问题描述 Java的封装类型和原始类型的区别?在JavaWeb程序当中,pojo(javabean)实体类中,是声明为封装类型好还是原始类型好?(比如:int-Integer)例如:public class User{private int id;private Integer id1;}int 默认初始化为0:Integer初始化为null:如果在web前端通过ajax请求到后台的时候,参数传递为 id=&di1=后台获取参数值时:id=1id1=null然后,保存到数据库时,Integer是

Java代码为例讲解堆的性质和基本操作以及排序方法_java

堆的性质堆是一棵完全二叉树,实际中可以通过一个数组来实现,它最重要的一个性质是:任意节点都小于(大于)等于其子节点.将根节点最小的堆称为最小堆,根节点最大的堆称为最大堆.下图给出了一个最大堆的示例及其数组表示,可以直观地看出每个节点都比它的孩子们都要大. 在上图中可以看到,完全二叉树的节点可以从根节点编号为1开始按顺序排列,对应数组A中的索引(注意此处下标是从1开始的).给定一个节点i,我们很容易可以得到它的左孩子是2i,右孩子是2i+1,父节点是i/2 堆的基本操作堆有两种基本操作(下面以最小