文档章节

内存:栈与堆

不上八千不洗澡
 不上八千不洗澡
发布于 2014/11/29 19:58
字数 1103
阅读 26
收藏 0

内存可以分为3个区:方法区(又叫静态区method)、栈(stack)和堆(heap)

1.方法区

         存放所有的class(即类中的函数也存放于此区)和静态变量,方法区存放的是整个程序中唯一的元素,如class和static变量。

         可以被所有的线程共享,这一点和堆heap一样。

2.栈内存:

         存储的都是局部变量。

         而且变量所属的作用域一旦结束,该变量就自动释放。

3.堆内存

                 存储的都是实体,数组和对象(数组就是对象),每一个实体都有首地址值。

           凡是new出来的都在堆内存,并都将进行默认的初始化。

           不需要手动释放、自动垃圾回收。


 

          堆内存中的实体数据地址都存储在栈变量中(即引用),以便能够高速访问。引用丢失后将被GC(垃圾回收器)列入可回收“名单”中,即变为垃圾,等待自动回收(区别于C++,C++中new出来的数组需要Delete,类的话需要析构函数进行析构才能释放内存)。

 

关于内存地址:

只需关注最左边的两个字符:

                                   “[”表示这个实体是数组型实体

                                                      I表示int  F表示float

 

 

java中变量在内存中的分配

1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期--一直持续到整个"系统"关闭

2、实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的 空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置"。 实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

3、局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

 

    Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个 变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。

  堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的 首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象 起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

  这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!


© 著作权归作者所有

上一篇: 继承
下一篇: Swing开发入门
不上八千不洗澡
粉丝 0
博文 14
码字总数 8900
作品 0
长沙
程序员
私信 提问
Stack vs. Heap:了解 Java 的内存分配机制

知道栈和堆之间的区别吗?什么时候该用哪一个,它们提供了什么功能? 这是一篇关于内存分配的指南。 栈和堆是与关于 Java 内存分配的两个重要概念。我们来看看这两个概念,为什么它们很重要,...

oschina
2017/08/14
3.2K
8
C++用new来创建对象和非new来创建对象的区别

我们都知道C++中有三种创建对象的方法,如下: include <iostream> using namespace std; class A{private: public: }; int main(){   delete c;//释放对象 } 第一种和第二种没什么区别,一...

DannyCoder
2018/09/05
10
0
C/C++程序内存分配整理二——堆和栈的区别

1、申请方式 stack: 由系统自动分配。 例如,声明在函数中一个局部变量int b; 系统自动在栈中为b开辟空间。 heap: 需要程序员自己申请,并指明大小,在C中malloc函数,C++中是new运算符。 如...

吴国青
2013/09/09
890
0
C++ 内存管理—01

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。   栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动...

ucliaohh
2016/10/13
20
0
堆栈的区别及增长方向

一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — ...

geek_loser
2016/07/04
53
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt程序打包发布方法(使用官方提供的windeployqt工具)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/toTheUnknown/article/details/81748179 如果使用到了Qt ...

shzwork
29分钟前
4
0
MainThreadSupport

MainThreadSupport EventBus 3.0 中的代码片段. org.greenrobot.eventbus.MainThreadSupport 定义一个接口,并给出默认实现类. 调用者可以在EventBus的构建者中替换该实现. public interface ...

马湖村第九后羿
50分钟前
3
0
指定要使用的形状来代替文字的显示

控制手机键盘弹出的功能只能在ios上实现,安卓是实现不了的,所以安卓只能使用type类型来控制键盘类型,例如你要弹出数字键盘就使用type="number",如果要弹出电话键盘就使用type="tel",但这...

前端老手
今天
6
0
总结:Raft协议

一、Raft协议是什么? 分布式一致性算法。即解决分布式系统中各个副本数据一致性问题。 二、Raft的日志广播过程 发送日志到所有Followers(Raft中将非Leader节点称为Follower)。 Followers收...

浮躁的码农
今天
7
0
Flask-admin Model View字段介绍

Model View字段介绍 can_create = True 是否可以创建can_edit = True 是否可以编辑can_delete = True 是否可以删除list_template = 'admin/model/list.html' 修改显......

dillonxiao
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部