栈(stack)与堆(heap)是两种数据结构,其数据项均按序排列,即只能在一端对数据项进行插入、删除等操作。其中栈一般由编译器自动分配释放,用来存放方法的参数值、局部变量等数据,遵循先进后出(First-In/Last-Out)原则;堆则一般运行时分配,用来存放New出来的对象等数据,由JVM自动回收,遵循先进先出(First-In/First-Out)原则。
栈堆均存在缓存机制,其中栈用的是一级缓存,局部变量等被调用时分配内存,调用完毕则空间立即被释放;栈使用的是二级缓A存,其生命周期由Java虚拟机JVM的垃圾回收算法自动回收。很显然,因为缓存机制不同栈中局部变量等数据调用速度会比较快,而堆中对象等数据生命周期不确定且属于运行时动态分配,故调用速度效率相对较低。
这里我做一个不太妥当的比喻以帮助大家理解:栈是呼吸系统,进入呼吸系统的主要是空气,空气更新比较快;堆是消化系统,一个馒头一只苹果地进去,经过消化系统较长时间的消化后才被排出,并且早上吃的鸡蛋一定比晚上吃的粥先排出来,如下示意图所示:
举个具体的例子,我们知道 int、byte、short、float等基本数据类型定义的时候是以“数据类型变量名 = 变量值;”的方式进行定义,如int x=1;。编译器分析这句话的时候首先在栈中创建一个变量为x的引用,然后在栈中进行查找,看有没有值为1的地址存在;如果存在则将引用指向该地址,否则开辟存放1的地址并将变量x指向该地址,这里假设指向的地址为0x0001。需要注意的是,这些基本数据类型是值类型,传递的是值而非引用。即如果定义一个新的变量y=1;编译器就是寻找值为1,因为之前有x的引用指向的值为1,所以找到了,那么栈中创建变量y的引用并指向x指向的地址,亦即x、y两个变量指向同一个地址0x0001。这时候我们改变x的值,比如x=3;,因为栈里面找不到值为3的地址,所以栈开辟新的空间来存这个值,比如这个空间地址是0x0002,这时候x的值确实变化了,但x 的变化并没有影响y的值的变化,y变量的引用指向的仍旧是值为1的地址0x0001。栈的内部处理流程及结构如下图所示:
Java中通过new()关键字来显式告诉编译器这些new出来的对象要放在堆中,并且是运行时才能动态创建,其内部运行机制和结构与栈类似,栈弄明白了堆自然而然也就变得明了。
作者:忆辛,公历2015年2月2日17时09分写于羊城,发表在iteye网站,未经作者书面许可,任何单位或个人不得转载、复制本文的全部或部分内容。
相关推荐
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
Java 基础入门,适合初学入门java的同学
java 基础异常 java 基础异常java 基础异常java 基础异常java 基础异常 java 基础异常java 基础异常java 基础异常java 基础异常 java 基础异常java 基础异常java 基础异常java 基础异常 java 基础异常java 基础异常...
java基础的案例分析和实例教学,适合新手及回顾查阅,对于夯实基础有好处
写的很详细,适合初学者,里面的讲解很丰富,很有学习价值,最好是配套一本详细的JAVA基础一起看,会有更好的效果
javajava简介及基础教程和实用案例分析及特点阐述java简介及基础教程和实用案例分析及特点阐述java简介及基础教程和实用案例分析及特点阐述java简介及基础教程和实用案例分析及特点阐述java简介及基础教程和实用案例...
Java基础教程完整版 Java基础教程完整版是JAVE_LOVER作者提供的一系列Java教程,总共包含18个章节,涵盖了JavaSE基本...Java基础教程完整版涵盖了JavaSE基本知识点、UML建模、单元测试等内容,是Java学习的不二之选。
【标题】:“韩顺平_循序渐进学Java零基础【完整笔记】1” 【描述】:这个课程是为初学者设计的,旨在通过系统的学习帮助学生掌握Java编程的基础。课程分为三个阶段,详细讲解了Java语言的核心概念、就业前景以及在...
java基础理论知识串讲java基础理论知识串讲
### Java基础知识总结(绝对经典) #### 一、Java概述 - **起源与发展**:Java语言始于1991年Sun公司的James Gosling等人所开发的Oak语言,原计划用于控制嵌入式设备如有线电视交换盒和个人数字助理(PDA)。1994年...
1. **Java简介**:介绍Java的发展历程、应用领域以及为什么选择学习Java。可能会提及Java的“一次编写,到处运行”(Write Once, Run Anywhere, WORA)特性。 2. **环境搭建**:如何安装Java Development Kit (JDK)...
Java基础教程 教学ppt. 苏州职业大学计算机与电子工程系曾海 <br>内容如下: <br>Java基础教程第十三单元《文件处理》ppt及习题 Java基础教程第十二单元《意外处理》ppt+习题+作业 Java基础教程第...
1. **Java简介**:Java的起源、特点和应用领域,以及为什么它在软件开发中占据重要地位。 2. **环境配置**:如何安装Java Development Kit (JDK),设置环境变量,以及使用Java编译器javac和运行时环境java。 3. **...
Java基础总结,融入java基础绝大部分内容,更会在之后的博客中逐渐细化。写一个两年以后还能看懂的博客
《传智播客毕向东Java基础全套视频教程》黑马程序员下载地址.txt ) 完整的视频资源,入门必备.
Java基础入门教程 第1章 Java 简介(共31页).ppt Java基础入门教程 第2章 java语言基础(共52页).ppt Java基础入门教程 第3章 类和对象(共40页).ppt Java基础入门教程 第4章 继承和多态(共36页).ppt Java基础...
《Java基础教程(第3版)》以通俗易懂的语言,循序渐进地向读者介绍了Java语言编程的基础知识。针对较难理解的问题,所列举的例子都是由简到繁,便于读者掌握Java编程技巧。在第3版中加大了面向对象的知识容量,补充...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。这份"Java十大基础笔记整理(PDF)"提供了全面的Java基础知识概览,适合初学者进行学习和复习。下面,我们将深入探讨Java的基础知识,涵盖...
01.15_Java语言基础(Java开发工具介绍和JDK简介) 01.16_Java语言基础(第一个HelloWorld案例的编写和运行) 01.17_Java语言基础(开发中常见问题小结) 01.18_Java语言基础(为什么要配置path环境变量) 01.19_Java语言...