一个例子理解全部

为了理解的比较深刻,先给一个例子。通过例子讲解印象更加深刻吧,假设我们在idea或者是任何IDE环境中定义了一个类。

有一个person类

public class Person{int age;String name;Baby baby;public void walk() {System.out.println("我正在走路。。。。");}
}

还有个Baby类

public class Baby{String babyname;int babyAge;public void cry(){System.out.println("我是孩子,我会哭");}
}

最后是一个测试类Test

public class Test {public static void main(String[] args) {Person person = new Person();person.name = "冯冬冬的IT技术栈";person.age = 18;person.walk();
​Baby baby= new Baby();baby.babyname = "冯XX";System.out.println(baby.babyname);person.baby = baby;System.out.println(pserson.baby.cry);}
}

好了有了上面的环境,接下来就开始分析这些代码在运行时内存的变化。现在在我们的IDE开始运行。

  1. 第一步,JVM去方法区寻找Test类的代码信息,如果有直接调用,没有的话使用类的加载机制把类加载进来。同时把静态变量、静态方法、常量加载进来。这里加载的是(“赵晗”,“赵XX”);这是因为字符串是常量,age中的18是基本类型。
  2. 第二步,jvm进入main方法,看到Person person=new Person()。首先分析Person这个类,同样的寻找Person类的代码信息,有就加载,没有的话类加载机制加载进来。同时也加载静态变量、静态方法、常量(“我正在走路。。。”)
  3. 第三步,jvm接下来看到了person,person在main方法内部,因而是局部变量,存放在栈空间中。
  4. 第四步,jvm接下来看到了new Person()。new出的对象(实例),存放在堆空间中。
  5. 第五步,jvm接下来看到了“=”,把new Person的地址告诉person变量,person通过四字节的地址(十六进制),引用该实例。 是不是有点晕,别着急,画个图看一下。
  6. 第六步,jvm看到person.name = "赵晗";person通过引用new Person实例的name属性,该name属性通过地址指向常量池的"赵晗"。
  7. 第七步,jvm看到person.age = 18; person的age属性是基本数据类型,直接赋值。
  8. 第八步,jvm看到person.walk(); 调用实例的方法时,并不会在实例对象中生成一个新的方法,而是通过地址指向方法区中类信息的方法。
  1. 第九步,jvm看到Baby baby=new Baby().这个过程和Person person = new Person()一样
  2. 第十步,jvm看到baby.babyname = "赵XX";这个过程也和person.name = "赵晗";一样。
  3. 第十一步,jvm看到person.baby = baby;把baby对象引用赋值给Person实例的baby属性属性。

好了,到了这一步,应该对java7的内存结构有一个详细的认识

需要更多教程,微信扫码即可

用例子理解java7内存结构相关推荐

  1. JVM之深入理解JVM内存结构(Java内存结构/Java内存区域)、Java内存模型

    Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的JVM内存结构.JAVA内存结构.JAVA内存 ...

  2. java 8的内存分代改进_java8的内存结构,这一篇文章就够了

    在一开始学习java的时候,那时候是在网上看视频,老师就经常提到什么对象分配在堆区,什么在栈区,那时候和理解,后来理解了就想着写一篇文章好好的去梳理一下. 想说一下这篇文章的脉络: 首先,研究java ...

  3. [Java基础] -- Java7/8 内存结构的理解

    本文转自:https://blog.csdn.net/laomo_bible/article/details/83067810 Java内存结构是每个java程序员必须掌握理解的,这是Java的核心基 ...

  4. js堆和栈的区别_几个例子理解不同数据类型的堆栈内存处理

    如有错误烦请指正 js代码的运行环境 浏览器 内核(引擎) node webview(hybrid,嵌入到手机app里面,在app里面运行) ... 下面通过几个例子理解不同数据类型的堆栈内存处理 j ...

  5. java多线程构造函数_java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解...

    多线程与JVM内存结构的关系[了解]: 对于最后一个有疑问的构造中stackSize参数,其实学过编程滴人从参数字面就比较容易理解,栈大小嘛,这里从官方文档上来了解一下这个参数: 而之前在学习java ...

  6. JVM_01 内存结构(深入理解+图解)

    本文笔记参考创智播客JVM课程 和<深入理解Java虚拟机第三版> 传智播客JVM 一.JVM 入门介绍 1.1 JVM 定义 Java Virtual Machine,JAVA程序的运行 ...

  7. java:JVM内存结构初步理解入门:堆、栈、方法区(浅显通俗易懂自记)

    自己整理的一些资料以及自己的一些理解,希望记下来的不是高大上而晦涩的概念,将自己此时此刻的理解最大程度地刻模,以便将来重温知新. JVM内存结构最简单可以初步分为:1栈 2堆 3方法区 4 程序计数器 ...

  8. 【Java千问】你了解Java内存结构么(Java7、8、9内存结构的区别)

    Java内存结构是每个java程序员必须掌握理解的,这是Java的核心基础,对我们编写代码特别是并发编程时有很大帮助.由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是 ...

  9. 深入理解Java内存架构

    hi,大家周末好,今天给大家带来一篇硬核的技术文章,本文我们将从计算机组成原理的角度详细阐述对象在JVM内存中是如何布局的,以及什么是内存对齐,如果我们头比较铁,就是不进行内存对齐会造成什么样的后果, ...

最新文章

  1. mybaits错误解决:There is no getter for property named 'parentId ' in class 'java.lang.String'
  2. C++ 并发编程(四):基于 Asio 的线程池
  3. python 函数前有一个下划线_【Python】怎么写好一个 Python 函数?
  4. vs2013和vs2010的配置
  5. 看这玩意复习你还会挂科?《软件工程2篇》
  6. 23个实用 Javascript Tab导航插件
  7. leetcode —— 687. 最长同值路径
  8. 001mongodb数据库介绍002mongodb的增删改查003数据导入导出
  9. 常用类中的方法 —— java.lang.String
  10. 单片机串口控制树莓派3B播放HDMI视频,omxplayer,
  11. 如何让Mac电脑在Finder窗口顶部显示文件路径?
  12. 新软件--AutoReply(自动回复),还能自动接听,做答录机
  13. chrome插件开发(Demo案例)
  14. C站能力认证(C4前端基础认证) //任务二:根据浮动布局以及定位布局的特性,实现构建下列(截图)中的页面
  15. 混合溶剂中的高分子凝胶中的渗透压的一般计算
  16. mac java 安装教程_MAC安装JDK详细教程
  17. 查找算法--Java实例/原理
  18. java黑马面试_JavaWeb-黑马面面(面试刷题系统)项目实战
  19. python中key=lambda_排序后的语法(key=lambda:…)
  20. Navicat Premium绿色版安装

热门文章

  1. 苹果官方首次松口:新款iPhone SE有望近期亮相
  2. 想换机的再等等!低价iPhone9或将推迟发布
  3. 微信短内容要来了!新功能已开启内测申请
  4. “哎哟,真的很快哦” 闪送宣布签约周杰伦为其品牌代言人
  5. 还有人买吗?苹果新一代iPod touch悄然发布:升级为A10芯片
  6. 苹果推出十年来首款游戏 “股神”巴菲特担任游戏主角
  7. 买写真送手机系列 小米9王源限量版预售将在这些小米之家开启
  8. 心痛!常德网约车司机遇害 滴滴回应:已成立应急处置小组
  9. php 添加 redis 扩展模块
  10. python实现查询mac号对应的OUI厂商信息