java 堆 栈 ===_Java堆,栈,堆栈
栈(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堆,栈,堆栈相关推荐
- java的堆和栈_Java 堆和栈的区别
1.概述 在Java中,内存分为两种,一种是栈内存,另一种就是堆内存. 2.堆内存 1.什么是堆内存? 1 堆内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对 ...
- java 栈 堆 区别_java中栈与堆的区别
1. 栈(stack)与堆(heap)都是Java用来在Ram(random access memory随机存取器)中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. ...
- java 本地方法栈_Java虚拟机栈和本地方法栈
Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...
- java堆内存_java堆内存详解
http://www.importnew.com/14630.html java堆的特点 <深入理解java虚拟机>是什么描述java堆的 Java堆(Java Heap)是java虚拟机 ...
- java string 栈_Java堆和栈的区别(String类)
堆与栈 Java的堆是一个运行时数据区,对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等指令建立,它们不需要程序代码来显式地释放.堆是由垃圾回 ...
- java 回收策略_Java堆回收策略
一.起源 1960年Lisp语言: 第一门真正使用内存动态分配和垃圾回收的语言. 二.概要 线程相关:程序计数器.虚拟机栈.本地方法栈,不需要考虑垃圾回收 Java堆.方法区:需要考虑垃圾回收 三.垃 ...
- java 堆 分析_Java堆分析 jmap+jhat
Java堆分析 jmap+jhat 最近在使用DataSync做数据迁移,执行了10天+,进程还未结束,也未出现错误日志,所以就看看是不是哪里卡住了... jmap命令: -dump:[live,]f ...
- java堆内存_java堆内存模型
广泛地说,JVM堆内存被分为两部分--年轻代(Young Generation)和老年代(Old Generation). 年轻代 年轻代是所有新对象产生的地方.当年轻代内存空间被用完时,就会触发垃圾 ...
- java 常量池 和 堆 的关系_Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)...
博客分类: Java综合 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有 ...
最新文章
- LabVIEW基础培训
- 通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 - Part I
- linux rpm 包制作详解
- oracle数据库的医院信息系统数据库升级方案,医院信息系统数据库从Oracle8i到10gR2升级的实现...
- [css] 写出在不固定宽高的元素在固定高度的情况下水平垂直居中的方法
- 保存验证码的方法_selenium自动化测试:6.验证码处理
- web mysql 报表_由简到难生成数据库报表(一)
- 荣耀开年第一机!荣耀60 SE今日官宣:搭载天玑900处理器
- flink sink jdbc没有数据_No.2 为什么Flink无法实时写入MySQL?
- 认证授权介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记109
- 玩玩AJAX之使用ashx文件响应来自JQuery的JSON请求.
- ZZULIOJ1071-1075Python解法
- HTML中的表格和表单(含有示例代码)
- 诛仙mysql架设_目前最完整的诛仙私服架设教程
- 一个完整推荐系统的设计实现-以百度关键词搜索推荐为例
- 运维信息系统 (Devops Information System)开发日志
- 【观察】从新华三2022十大技术趋势,看数字化如何重塑未来社会
- plc控制伺服电机 四轴攻丝机案例(包含伺服接线图)
- 空间两条直线的最短距离及最近点计算
- 数字集成电路设计系列学习总结
热门文章
- 【Logstash】logstash 报错 logstash cannot write event to DLQ reached maxQueueSize of
- 【Flink】大数据分析常用去重算法分析『HyperLogLog 篇』
- 【MySQL】MySQL 查看数据库表列表的3种方式
- Memcache监控小工具stats命令
- Spark Structured Straming:'writeStream' can be called only on streaming Dataset/DataFrame
- Docker 安装 Tomcat
- 常用的排序算法总结(一)
- linux扩容根目录空间_记一次生产线上Linux系统根目录爆满问题解决办法
- 2020年10月程序员工资统计,平均14459元
- 探讨Netty获取并检查Websocket握手请求的两种方式