栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器

在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域).存放函数的参数值,局部变量的值等

①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)

③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。

堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中,需要手动释放.

在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象.所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用.堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

在JAVA中,有六个不同的地方可以存储数据:

1. 寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。

2.

堆栈(stack)。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些

内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成

相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其

中。

3.

堆(heap)。一种通用性的内存池(也存在于RAM中),用于存放所以的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区

域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行

这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。

4. 静态存储(static storage)。这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。

5. 常量存储(constant storage)。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中

6. 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。

就速度来说,有如下关系:

寄存器 < 堆栈 < 堆 < 其他

这是一个前辈写的,非常详细//main.cpp

int a = 0; 全局初始化区char *p1; 全局未初始化区

main()

{intb; 栈char s[] = "abc"; 栈char *p2; 栈char *p3 = "123456"; 123456/0在常量区,p3在栈上。static int c =0; 全局(静态)初始化区

p1= (char *)malloc(10);

p2= (char *)malloc(20);

分配得来得10和20字节的区域就在堆区。

strcpy(p1,"123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

}

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就

走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自

由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由

度大。   (经典!)

java 堆 栈 ===_Java堆,栈,堆栈相关推荐

  1. java的堆和栈_Java 堆和栈的区别

    1.概述 在Java中,内存分为两种,一种是栈内存,另一种就是堆内存. 2.堆内存 1.什么是堆内存? 1 堆内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对 ...

  2. java 栈 堆 区别_java中栈与堆的区别

    1. 栈(stack)与堆(heap)都是Java用来在Ram(random access memory随机存取器)中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. ...

  3. java 本地方法栈_Java虚拟机栈和本地方法栈

    Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...

  4. java堆内存_java堆内存详解

    http://www.importnew.com/14630.html java堆的特点 <深入理解java虚拟机>是什么描述java堆的 Java堆(Java Heap)是java虚拟机 ...

  5. java string 栈_Java堆和栈的区别(String类)

    堆与栈 Java的堆是一个运行时数据区,对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等指令建立,它们不需要程序代码来显式地释放.堆是由垃圾回 ...

  6. java 回收策略_Java堆回收策略

    一.起源 1960年Lisp语言: 第一门真正使用内存动态分配和垃圾回收的语言. 二.概要 线程相关:程序计数器.虚拟机栈.本地方法栈,不需要考虑垃圾回收 Java堆.方法区:需要考虑垃圾回收 三.垃 ...

  7. java 堆 分析_Java堆分析 jmap+jhat

    Java堆分析 jmap+jhat 最近在使用DataSync做数据迁移,执行了10天+,进程还未结束,也未出现错误日志,所以就看看是不是哪里卡住了... jmap命令: -dump:[live,]f ...

  8. java堆内存_java堆内存模型

    广泛地说,JVM堆内存被分为两部分--年轻代(Young Generation)和老年代(Old Generation). 年轻代 年轻代是所有新对象产生的地方.当年轻代内存空间被用完时,就会触发垃圾 ...

  9. java 常量池 和 堆 的关系_Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)...

    博客分类: Java综合 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有 ...

最新文章

  1. LabVIEW基础培训
  2. 通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 - Part I
  3. linux rpm 包制作详解
  4. oracle数据库的医院信息系统数据库升级方案,医院信息系统数据库从Oracle8i到10gR2升级的实现...
  5. [css] 写出在不固定宽高的元素在固定高度的情况下水平垂直居中的方法
  6. 保存验证码的方法_selenium自动化测试:6.验证码处理
  7. web mysql 报表_由简到难生成数据库报表(一)
  8. 荣耀开年第一机!荣耀60 SE今日官宣:搭载天玑900处理器
  9. flink sink jdbc没有数据_No.2 为什么Flink无法实时写入MySQL?
  10. 认证授权介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记109
  11. 玩玩AJAX之使用ashx文件响应来自JQuery的JSON请求.
  12. ZZULIOJ1071-1075Python解法
  13. HTML中的表格和表单(含有示例代码)
  14. 诛仙mysql架设_目前最完整的诛仙私服架设教程
  15. 一个完整推荐系统的设计实现-以百度关键词搜索推荐为例
  16. 运维信息系统 (Devops Information System)开发日志
  17. 【观察】从新华三2022十大技术趋势,看数字化如何重塑未来社会
  18. plc控制伺服电机 四轴攻丝机案例(包含伺服接线图)
  19. 空间两条直线的最短距离及最近点计算
  20. 数字集成电路设计系列学习总结

热门文章

  1. 【Logstash】logstash 报错 logstash cannot write event to DLQ reached maxQueueSize of
  2. 【Flink】大数据分析常用去重算法分析『HyperLogLog 篇』
  3. 【MySQL】MySQL 查看数据库表列表的3种方式
  4. Memcache监控小工具stats命令
  5. Spark Structured Straming:'writeStream' can be called only on streaming Dataset/DataFrame
  6. Docker 安装 Tomcat
  7. 常用的排序算法总结(一)
  8. linux扩容根目录空间_记一次生产线上Linux系统根目录爆满问题解决办法
  9. 2020年10月程序员工资统计,平均14459元
  10. 探讨Netty获取并检查Websocket握手请求的两种方式