转载:

一、java栈

Java 栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的Java栈,在这个Java栈中又会含有多个栈(Frames),这些栈帧是与每个方法关联起来的,每个运行一个方法就创建一个栈帧会含有一些“内部变量"(在方法内定义的变量)、"操作栈"和"方法返回值"等信息。

二、堆

堆是存储Java 对象的地方,它是JVM管理 Java 对象的核心存储区域,堆是 Java 程序员最应该关心的,因为它是我们的应用程度与内存关系最密切的存储区域。

每一个存储在堆中的Java 对象都会是这个对象的类的副本,它会复制包括继承自它父类的所有非静态属性。

堆是被所有 Java 线程所共享的,所以对它的访问需要注意同步问题,方法和对应的属性都需要保证一致性。

内存可以分为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 中的指针!

java栈和堆的区别_java 栈 和 堆 的区别相关推荐

  1. c语言和c++还有java_C语言和Java的区别_JAVA和C++的核心区别

    C语言和Java作为编程界的两大编程语言,两者之间,有联系又有区别.下面学习啦小编带你去了解一下JAVA和C++的核心区别吧. C语言和Java的区别 A.在继承中的区别 C语言是多线继承,比如:小轿 ...

  2. java 栈和堆 进出顺序_Java内存分配---堆与栈

    堆和栈的概念接触已久,也很容易让人似懂非懂.本文阐述它们的区别和作用.配合一个小例子,加深对其理解. 堆内存 堆内存是在Java程序运行时分配的,它用来存放对象,对象也总是在堆中.GC的作用域也是在堆 ...

  3. java null和 的区别_java中null和的区别

    null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...

  4. java.io和util的区别_Java NIO与IO的区别和比较

    Java NIO与IO的区别和比较 导读 J2SE1.4以上版本中发布了全新的I/O类库.本文将通过一些实例来简单介绍NIO库提供的一些新特性:非阻塞I/O,字符转换,缓冲以及通道. 一. 介绍NIO ...

  5. java堆是什么_java中的堆是什么意思?

    java中的堆是什么意思? 发布时间:2020-06-10 19:27:03 来源:亿速云 阅读:198 作者:鸽子 对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中 ...

  6. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  7. java和equals区别_JAVA中==与equals的区别

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们"实际意义上相等",比较的是内容,而不是引 ...

  8. java equals 区别_Java中equals和==的区别

    转自:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据 ...

  9. java 静态方法 实例方法的区别_java 静态方法和实例方法的区别

    静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方 ...

最新文章

  1. php 复选框 单选 全选,复选框全选/不全选,选择结果提交
  2. mysql备份数据库语句6_13.4 MySQL用户管理;13.5 常用sql语句;13.6 MySQL数据库备份恢复...
  3. C++ 中的左值(Lvalues)和右值(Rvalues)
  4. 深入解释yield和Generators(生成器)
  5. 这些工具你利用好了吗?
  6. python open ascii codec cant_Python3.6 报错问题:'ascii' codec can't encode character
  7. java 获取继承字段_java – 从类中获取所有字段(甚至是私有的和继承的)
  8. 罗德里格斯(Rodrigues)旋转方程推导
  9. [CTO札记]给新助理的3句话
  10. 河北省科技创新平台用例图
  11. python数据库操作——Oracle超详细安装过程
  12. 多学习,C++值得看的书籍
  13. 尚硅谷nginx学习笔记
  14. Origin图例去除边框
  15. 加油站(贪心)【LeetCode】
  16. Android之讯飞语音-文字转语音(不用另外安装语音合成包apk)遇到的问题
  17. 序列的运算、操作、函数/方法
  18. hihoCoder#1538 大礼堂地毯 (模拟)
  19. Express jade
  20. 可控硅和场效应管区别

热门文章

  1. Grails通过sessionId获取session对象
  2. tomcat的热部署
  3. UGUI内核大探究(一)EventSystem
  4. setTimeout 定时器的使用
  5. go get报错unrecognized import path “golang.org/x/net/context”…
  6. CPU访问计算机各组件周期
  7. 我在定制office 2007时遇到的问题
  8. php中四种webservice实现的简单架构方法及实例
  9. windows下编译支持https的curl
  10. PostgreSQL数据导出成Insert语句