JAVA中堆和栈的区别
堆:(对象)
引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型常量),需要通过new等方式来创建。
堆内存主要作用是存放运行时创建(new)的对象。
(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)
栈:(基本数据类型变量、对象的引用变量)
基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放。栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先出"模式来实现的。
(主要用来执行程序,存取速度快,大小和生存期必须确定,缺乏灵活性)
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
java中变量在内存中的分配
1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期--一直持续到整个"系统"关闭
2、实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置"。 实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存
3、局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放
附:java的内存机制
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
JAVA中堆和栈的区别相关推荐
- JAVA中堆和栈的区别和联系
一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于储存实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. 栈 ...
- java中堆和栈的区别!!!!
Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放.堆是由垃圾回 ...
- 让你彻底明白JAVA中堆与栈的区别
原文地址:http://www.2cto.com/kf/201302/190704.html 简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象 ...
- java中堆与栈的区别_java中堆和栈的区别分析
堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...
- [Java_kaikeba]java中堆和栈的区别(对象变量的理解)
.堆和栈都是java用来在RAM中存放数据的地方.与C++不同,java自动管理堆栈, 程序员不能直接设置堆栈. .区别 1. .栈中存放基本数据类型变量(int. ...
- JAVA中堆和栈的区别[面试常问点一]
概念 堆内存:在java虚拟jvm中堆内存主要是存储数组和对象(当然数组也是对象),只要是通过new关键字创建的对象都是在堆中,而堆中存放的就是对象的实体,实体用来封装数据的,封装对象的属性,所以堆内 ...
- 面试:说说Java 中堆和栈的区别?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | nnngu 来源 | cnblogs.com/ ...
- java中堆与栈的区别 彻底理解
每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆.应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有 的线程共享.跟C/C++不同,Java中分配堆内存是自动初始 ...
- Java虚拟机:Java中堆和栈的详细区别
一.Java中内存分配策略: 在比较堆和栈的区别之前,我们先了解下Java的内存分配策略,按照编译原理的观点,程序运行时的内存分配有三种策略,分别是:静态的,栈式的,和堆式的. (1)静态存储分配:是 ...
最新文章
- 分析Booking的150种机器学习模型,我总结了六条成功经验
- 《算法竞赛中的初等数论》(五)正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- jQuery 图片剪裁插件初探之 Jcrop
- myisam怎么读_耗时半年,我成功“逆袭”,拿下美团offer(刷面试题+读源码+项目准备)...
- 阿里云CentOS服务器挂载数据盘
- windows下python环境搭建_Linux/Windows下Python环境搭建步骤
- 信息学奥赛一本通 1137:加密的病历单 | OpenJudge NOI 1.7 12
- Docker Centos安装 Openssh
- android view禁止右滑,ViewPager 禁止左右滑动完美解决
- python内置哪些装饰器_Python内置的wraps装饰器有什么用
- Hacker News 8 月招聘趋势榜:React 连续 15 月登顶,Python 卫冕编程语言
- CentOS 6.5 64位 安装zabbix-2.2.0
- OpenGL基础39:GLSL内建变量与接口块
- 开课吧Java课堂:如何使用迭代函数
- item不可见 recycleview_Android解决RecyclerView中的item显示不全方案
- 三种方法实现多级撤消/重做
- 【张朝阳的物理课笔记】 1. 力,牛顿定律,飞船角速度
- 杰理之RX传导杂散【篇】
- 自己写一个strcmp函数