说到java的堆和栈就想起来了,java内存中的分配结构。作为一个Java的程序员,我们肯定知道Java的程序是运行在java虚拟机上的,也就是平时所说的JVM。程序中所有的方法、变量、常量、实例、静态存储都是由JVM在内存中进行分配的。

1.    寄存器:JVM中运行最快的,JVM内部的虚拟的存储器和CPU有关,我们无法控制。

2.    堆栈(也就是平时所说的栈stack):用来存放基本数据类型和引用数据类型的实例的(也就是实例对象的在堆中的首地址,Person p = new Person; p存贮在堆栈中,值为@23651dff。还有就是堆栈是线程独享的。每一个线程都有自己的线程栈。

3.    堆(也叫做对内存或者对空间deap):用来存放程序动态生成的数据。(new 出来的对象的实例存储在堆中,但是仅仅存储的是成员变量,也就是平时所说的实例变量,成员变量的值则存储在常量池中。成员方法是此类所实现实例共享的,并不是每一次new 都会创建成员方法。成员方法被存储在方法区,并不是存储在第一个创建的对象中,因为那样的话,第一个对象被回收,后面创建的对象也就没有方法引用了。静态变量也存储在方法区中。局部变量在栈内存中,JVM为每一个类分配一个栈帧,然后引用类型的局部变量指向堆内存中的地址),堆是内存中共享的区域,要考虑线程安全的问题。

4.    方法区(non-deap,(非堆),在堆中为其分配的一部分内存):里面存储的是一些。类类型加载的东西(也就是反射中的.class之后的Class),用于存储已经被虚拟机加载的类的信息、常量、静态变量等。与堆一样,是被线程共享的内存区域,要注意线程安全问题。

5.     常量池:上面已经说了,存储在堆中的。JVM会对每一个加载的类维护一个常量池。用于存储成员变量中的数值。(String str= “aa”, aa也是存储在String.class类中的常量池中的。Str只是在栈中作为aa的首地址)

6.    代码段:这个就是用来存储代码片段的

7.    数据段:这个是用来存储静态成员的,包括静态变量,静态常量(存储在这里面的常量池当中),静态方法,静态类。

 

**下面就是java内存中的分配情况

里面还少一个方法区,存储在堆中。

说完JVM中的内存分配,我们来说一说堆和栈之间的区别。

1.堆

·存放new之后的实例

·每一个变量都有默认值(char:’/u0000’)

·生命周期未知,存储顺序未知。JVM有垃圾回收系统,GC会根据4种(强、软、弱、虚)引用进行不同程度的回收。

2.栈

·栈中存放的是基本数据类型和存放类对象的引用

·栈中的存放是有顺序的,而且JVM分配的空间是固定的,不能改变。这样使栈失去了灵活性。当局部变量使用完之后,JVM就会进行清除(也就是出栈)。

接下来使用一个小例子来对堆栈进行更深一步的了解

例子:

String str = “a”;

String strr = “bc”;

String str1 = "abc";     //定义字符串变量str1
        Stringstr2 = "abc";      //定义字符串变量str2
        Stringstr3 = new String("abc"); //以new的方式定义字符串变量str3
        Stringstr4 = new String("abc");//以new的方式定义字符串变量str4

String str5 = str + strr;

String str6 = “a” + “bc”;
       结果:
         * str1 ==str2    true;     ①
         * str2 ==str3    false;     ②
         * str3 ==str4    false;    ③

*str1 == str5  false;       ④

*str1.equals(str5)   true;   ⑤

*str1==str6        true;   ⑥

讲解:

·‘==’比较的是地址

Str1 和 str2显然指向的是String中常量池中的一个地址。(何灵鸿上次发的String的两种创建方式)

·equals比较的是内容

①  由于地址相同,所以true

②  由于str3 使用的new ,相当于在String类堆中创建了一个堆地址。而str2的地址则是在常量池中。地址对不上,因此false

③  和②的原理是一样的,相当于new了两个对象,也就是各自拥有了自己的地址。因此false。

④  str5使用的是字符串变量的相加。当看String的源码的时候,你会发现str.append()方法。本质上是先new 一个Stringbuilder对象,然后使用这个对象进行append,最后Builder对象toStirng回到String类型。也就是地址发生了变化。

结果:

⑤  比较的是内容,所以为true

⑥  也许看到这个会感到迷茫,一开始我也迷茫。后来一想,这种情况str6则是在常量池中进行的拼接(若存在,则直接指向;若不存在,拼接创建)

关于Java堆栈的理解与说明相关推荐

  1. 由一次线上故障来理解下 TCP 三握、四挥 Java 堆栈分析到源码的探秘

    本文导读: 生产故障场景介绍 TCP 建连三次握手过程 TCP 断连四次挥手过程 结合 Java 堆栈剖析源码 再从堆栈中找到"罪魁祸首" 问题优化方案总结 1.生产故障场景介绍 ...

  2. 【深入理解java虚拟机v3 】 4.2.6 jstack:Java堆栈跟踪工具(查看所有的线程信息占cpu最高的进程和线程)

    文章目录 1. 原文概述 补充概述 2. 例子 2.1 用jstack加进程id查找死锁 2.2 jstack统计线程数 2.3 jstack检测cpu高 3. 实战 3.1 一次cpu高的实战记录 ...

  3. [转载] JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解

    参考链接: 在Java中为静态最终static final变量分配值 转载来源:https://blog.csdn.net/peterwin1987/article/details/7571808 J ...

  4. java堆栈(java堆栈信息怎么看)

    什么是堆栈溢出的堆栈区域呢? 堆栈既可以向下增长(向内存低地址)也可以向上增长,这依赖于具体的实现 Java堆栈溢出的机制与原理是什么? Java堆栈溢出的出现,很让人痛苦的事情,很多时候都无法找到头 ...

  5. Java堆栈之间的差别?

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  6. Java 注解深入理解

    内容概要 Annotation的概念 Annotation的作用 Annotation的分类 系统内置注解 元注解 自定义注解 解析注解信息 JDK8注解新特性 附:项目源码地址 一.Annotati ...

  7. Java 面试经典题解析:谈谈你对 Java 平台的理解?

    作者|杨晓峰出处|极客时间<Java技术核心 36讲>专栏 从你接触 Java开发到现在,你对 Java最直观的印象是什么呢?是它宣传的 "Compile once, run a ...

  8. Java 多线程 —— 深入理解 volatile 的原理以及应用

    转载自  Java 多线程 -- 深入理解 volatile 的原理以及应用 推荐阅读:<java 多线程-线程怎么来的> 这一篇主要讲解一下volatile的原理以及应用,想必看完这一篇 ...

  9. 第一部分 Java:面向对象理解

    Java:面向对象理解.集合.IO.NIO.并发.反射源码分析 一.面向对象 1.创建对象的5种方式 (1)使用new关键字(2)使用Class类的newInstance方法(3)使用构造函数类的ne ...

  10. java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息

    Jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息. 这里需要注意的是 Java 8 引入了 Java Mission Control, ...

最新文章

  1. 谷歌首席科学家:搞研究的痛苦,搞工程的人不懂
  2. java-2018-01-17计划
  3. MyBatis collection的两种形式——MyBatis学习笔记之九
  4. Spring框架----Spring的bean的作用范围
  5. Uniswap 24小时交易量9.7亿美元,占以太坊上Dex总量的54%
  6. 戴尔推出PowerEdge T30,主打小型办公和家庭办公市场
  7. BZOJ3282: Tree (LCT模板)
  8. 一、linux内核源码分析(内核源码结构组成)
  9. 安装历史版本nvidia显卡驱动
  10. Codevs P1066 引水入城 2010年NOIP全国联赛提高组
  11. 【Qualcomm】在EFS的NV项中关闭VoLTE高清语音服务
  12. STL — 迭代器设计思维(一)
  13. 健康饮食--抗氧化与肠道调节
  14. 将DXSDK的帮助文档加入到VS6的MSDN中
  15. 单引号,双引号,三引号的区别
  16. C语言实例:输出八进制,十进制,十六进制,指定位数整数,带符号整数,科学计数法表示的整数
  17. CSDN年度征文 | 你好,2023
  18. swiper分页器踩坑
  19. 外包员工存在的问题及产生原因
  20. spark left join 和 right join 的坑

热门文章

  1. opencv codebook学习
  2. Laravel快速入门
  3. Python 调用摄像头进行人脸识别
  4. 美军综合电子信息系统
  5. 西电网络攻防大赛--渗透测试第五题
  6. 批发零售进销存 批发零售管理软件 批发零售店铺管理软件
  7. 90后美女学霸传奇人生:出身清华姚班,成斯坦福AI实验室负责人高徒
  8. 查找图片中隐藏的flag
  9. 全国计算机建模三等奖,喜报 | 建院学子喜获2019年第十三届全国大学生结构设计竞赛三等奖...
  10. word参考文献后面的附录在目录显示不出来如何解决