堆和栈

一 java 堆内存和栈内存

java把内存分为两种:一种是堆内存,一种是栈内存

堆: 堆内存主要存储实例化对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的。

栈:主要存储局部变量和对象的引用变量。每个线程都会有一个独立的空间,所以线程之间的数据是不可以共享的。

在函数中定义的一些基本数据变量和对象的引用变量都会存储到栈内存中,当在一段代码中定义一段变量时,java就在栈内存中为这个变量分配内存空间,当超过这个变量的作用域后,java会自动释放掉该变量分配的内存空间,该内存的空间可以立即被另做它用。

堆内存用于存放新建new对象和数组。

在堆中分配内存,由java虚拟机自动垃圾回收来处理。

二、堆和栈的共同点和优缺点

1、栈(stack)与堆(heap)都是java用于在Raw存放数据的地方,与C++不同,java自动关了堆和栈,程序员不能设置堆和栈。

2、栈的优势是,存储数据快,仅次于cup中的寄存器,但缺点是,存在存在栈中的数据大小与生存期必须是确定的,缺乏灵活性,另外,栈内存数据可以共享(这可能跟上面说的有点冲突,上面刚说的数据不能共享,现在又说可以共享,很矛盾,但是,栈内存在同一个线程中的数据是可以共享的,其他线程是不共享的),堆内存的优势是可以动态的分配内存的大小,生存期也不必要事先告诉编译器,java垃圾回收机制会自动收走这些不在使用的数据,但缺点是,由于运行时是动态分配内存的,所以存取速度较慢。

3、java中的数据类型有两种

一种是基本数据类型(primitive types),共有8种,即 int,short,long,byte,float,double,boolean, char(童鞋们要注意了,这里string不是基本类型)这种类型的定义是通过诸如 int a=3; long b =255L; 的形式来定义的,称为自动变量,值得注意的是,自动变量存的是字面值,不是类的实列,即不是类的引用,这里并没有类的存在,如 int a = 3 ;这里的a是一个指向int类的引用,指向3的字面值,这些字面值的数据,大小可知,生存期可知(这些字面值固定定义在某个程序模块里面,程序块退化后,字段值就消失了),出于追求速度的就存在栈内存中。

栈有个特殊的重要性,就是存在栈中的数据可以共享。

假设我们同时定义

int a = 3; int b = 3;

编译器先处理 int a =  3;首先他会在栈中创建一个变量值为a的引用,然后在查找有没有字面值为3的地址,没找到,就开辟一个存放3的字面值地址,然后将a指向3的地址,接着处理 int b = 3;在创建完b的引用变量后,由于在栈中已有有了3 的字面值,便将b直接指向3的地址,这样a和b同时指向了3的情况。

特别注意的是,这种字面值的引用与类对象的引用不同,假设两个对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也会立刻反应出这个变化。相反,通过字面值的引用来修改其值,不会导致另外一个指向此字面值的引用的值也跟着改变的情况。这就是上述情况,如果a的字面值更改成4后,b的字面值依然是3 ,不会因为a的字面值改变而改变。

另一种是包装类数据。如 Integer,String ,Double等将相应的基本数据类型包装起来的类。这些数据类型全部存储在堆内存中,java 用 new()语句来显示的告诉编译器,在运行是才根据需要动态创建,因此比较灵活,缺点是占用更多的时间

三、堆和栈的区别

1、各司其职

最主要的区别就是栈内存用于存储局部变量和方法的调用。而堆内存用来存储java中的对象,无论是成员变量,局部变量还是类变量,他们指向的对象都存储在堆内存中。

2、独有还是共享

栈内存归属于单个线程,每个线程都会有一个栈内存,其存储变量只能在所属线程中可见、共享,即栈内存可以理解为线程的私有内存。而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。

3、异常错误

如果栈内存没有可用空间存储方法调用和局部变量,JVM会抛出Java.lang.StackOverFlowError

如果堆内存没有可用空间存储生成的对象,JVM会抛出Java.lang.OutOfMemoryError.

4、空间大小

栈的内存要原因小于堆内存,如果你使用递归的话,那你的栈内存会很快充满,如果递归没有及时跳出,很可能会发送StackOverFlowError问题。

你可以通过-Xss选项设置栈内存的大小。-Xss选项可以设置堆开始时的大小,-Xmx选项可以设置堆内存的最大值。

这就是java中的堆和栈,理解好这个问题,可以对你解决开发中的问题,分析堆和栈内存使用,甚至性能调优都有帮助。

四、java中的堆和栈

JVM是基于堆栈的虚拟机,JVM为每个新创建的线程都分配了一个堆栈,也就是说,对于一个java程序员来说。他的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保持线程的状态,JVM对堆栈只进行两钟操作:以帧为单位的压栈和出栈操作,我们知道,某个线程正在执行的方法称为次线程的当前方法,我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个java方法,JVM就会在java的堆栈中新压入一个帧。这个帧自然称为了当前帧,在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据。这个这在这里和编译原理中的活动记录的概念差不多的,从java的这种分配机制来看,堆栈又可以这样理解,堆栈(stack)是操作系统在建立某个进程时或者线程(在支持多线程操作系统中的线程)为这个线程建立的存储区域。该区域具有先进后出的特性。

每一个java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享,跟C/C++不同,java分配堆内存是自动初始化的,Java中所有对象的 存储空间都是在堆中分配的,也就是说在建立一个对象时,在两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆中分配的内存只有一个指向这个堆对象的指针(引用)而已。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就...
    木有鱼丸啦阅读 538评论 0 0
  • 引言:看了网上一些作品,没有特别清晰的一个结构,所以,这里本人整理一下Java的堆栈相关知识。Java 中的堆和栈...
    androidjp阅读 13,360评论 18 189
  • 01 我开始注意小A是在大二的时候。在那时我是班委,班里突然通知要采集指纹信息,班里的人全都到了,除了小A。 我就...
    苏固阅读 798评论 2 6
  • 姬川明(组合)算是赛尔达漫画的专业户了。我记得我小学三年级的时候就在看他们画的塞尔达了。当时刚刚通关缩小帽,然后在...
    伊蒂雅阅读 1,496评论 0 2
  • 早上起来,心情是特别的差。而罪魁祸首就是英语书、小本子和英语练习册的离奇失踪。没了他们,别说英语作业了,其他作...
    故梦_9dc8阅读 120评论 0 0