栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、double、float、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。

方法区(method area):static final 修饰的成员变量都存储于方法区中,如常量池。

堆(heap):用于存储对象实例及数组。

方法区:

以String 类型来举例:          

1 String s1="abc";
2 String s2="abc";
3 String s3=new String("abc");
4 System.out.println("s1和s2 引用地址是否相同:"+(s1 == s2));        //true
5 System.out.println("s1和s2 值是否相同:"+s1.equals(s2));      //true
6 System.out.println("s1和s3 引用地址是否相同:"+(s1 == s3));     //false
7 System.out.println("s1和s3 值是否相同:"+s1.equals(s3));      //true

  内存结构图如下:                 

                         

  s1 和 s2 地址引用值相等,说明 s1 和 s2 引用的是同一个对象的地址,s3 与 s1 地址引用不等,说明 s3 与其他两个引用的不是同一个地址。

  java为了避免产生大量的String对象,设计了一个字符串常量池(存在内存中的方法区里)。工作原理是这样,创建一个字符串时,JVM首先会检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,如果没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引用地址,所以上面s1==s2结果为true。

  而 s3 不同的是,JVM首先是在字符串常量池中找 "abc" 字符串,如果没有则创建字符串常量,如果有则不需要创建;当遇到 new 时,还会在堆内存里面创建一个新的 String 对象,存储 “abc” ,并将堆内存上String 对象引用的地址返回,所以 s3 与 s1 、s2 引用的不是同一个字符串地址。

  

  本文参考:https://www.cnblogs.com/marsitman/p/11248001.html

  版权声明:本文版权归作者所有,欢迎转载,但请注明出处。

转载于:https://www.cnblogs.com/tooker/p/11249365.html

java内存中的栈、方法区 、堆相关推荐

  1. 内存中的栈空间与堆空间

    内存中的栈空间与堆空间 https://www.jiuzhang.com/tutorial/algorithm/352 我们通常所说的内存空间,包含了两个部分:栈空间(Stack space)和堆空间 ...

  2. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  3. 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

    堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中) 1.存储的全部是对象 ...

  4. 常见Java面试题之解释内存中的栈、堆和静态区用法

    栈(stack).堆(heap)和静态区(static area)的用法区别 * 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间: * 通过new关 ...

  5. Java - 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 通常我们定义一个基本数据类型的变量,一个对象的引用, ...

  6. 解释内存中的栈、堆、静态区

    ①通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是方法调用的现场保存都使用内存中的栈空间. ②通过new关键字和构造器创建的对象都放在堆空间. ③程序中的字面量,比如直接写的100.&qu ...

  7. Java虚拟机中的栈和堆

    Java虚拟机中的栈和堆 简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,J ...

  8. 如何给女朋友讲明白:Java中Stack(栈)与Heap(堆)

    背景 Java中Stack(栈)与Heap(堆)是面试中被经常问到的一个话题. 有没有对Java中Stack(栈)与Heap(堆)烂熟于心的童鞋,请举手!!!(怎么没人举手-) 这个时候蜗牛哥的对象弱 ...

  9. Java虚拟机(九)——方法区

    文章目录 堆.栈.方法区的交互关系 线程是否共享: 三者的交互关系: 方法区的理解 方法区的位置 基本理解: 设置方法区大小 JDK7以前 JDK8及以后: 方法区的内部结构 方法区存储什么 类型信息 ...

最新文章

  1. 如何促使团队紧密协作
  2. 奇妙的Base64编码
  3. android摄像头框架,FS_S5PC100平台上Android Camera架构分析
  4. Mac 终端提示:The default interactive shell is now zsh.
  5. chrome密码管理
  6. 【转载】Katalon Studio 基本用法--录制脚本并查看测试报告
  7. WPF DataGrid:解决排序、ScrollIntoView、刷新和焦点问题
  8. 微课|中学生可以这样学Python(7.3.1节):私有成员与公有成员
  9. python 全角字符和半角字符切换
  10. 【福利】小程序开发资源干货汇总
  11. EasyPoi 导出表格并设置表头
  12. php 图片印章_PHP实现中文圆形印章特效
  13. .odex文件的反编译
  14. CRF原理介绍(以BILSTM-CRF模型为例)
  15. 独立手机版营销推广落地页pbootcms模板落地页单页网站
  16. 【电子学会】2019年12月图形化三级 -- 合作画画
  17. GMF 所依赖的插件
  18. 跟阿里巴巴学开会,我们拉着5位CEO聊如何“捅刀子”
  19. 平台业务收款分账产品设计 - 总览
  20. C语言中除以怎么使用

热门文章

  1. haproxy调度web案例
  2. 创建原生JS insertafter()方法实现
  3. 2017-06-08 前端日报
  4. shell 常用命令语句
  5. Educational Codeforces Round 8 D. Magic Numbers 数位DP
  6. Oracle计算时间差函数
  7. mysql数据源找不到_mysql报出找不到目标数据源为啥? 同一个方法在其他地方调用正常...
  8. Linux用户和HDFS和Hive权限关系
  9. 机器学习知识点(二十)矩阵奇异值分解基础知识及Java实现
  10. rockemq 发送延迟消息_RockeMQ通过代码监控消费者状态