用例子理解java7内存结构
一个例子理解全部
为了理解的比较深刻,先给一个例子。通过例子讲解印象更加深刻吧,假设我们在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开始运行。
- 第一步,JVM去方法区寻找Test类的代码信息,如果有直接调用,没有的话使用类的加载机制把类加载进来。同时把静态变量、静态方法、常量加载进来。这里加载的是(“赵晗”,“赵XX”);这是因为字符串是常量,age中的18是基本类型。
- 第二步,jvm进入main方法,看到Person person=new Person()。首先分析Person这个类,同样的寻找Person类的代码信息,有就加载,没有的话类加载机制加载进来。同时也加载静态变量、静态方法、常量(“我正在走路。。。”)
- 第三步,jvm接下来看到了person,person在main方法内部,因而是局部变量,存放在栈空间中。
- 第四步,jvm接下来看到了new Person()。new出的对象(实例),存放在堆空间中。
- 第五步,jvm接下来看到了“=”,把new Person的地址告诉person变量,person通过四字节的地址(十六进制),引用该实例。 是不是有点晕,别着急,画个图看一下。
- 第六步,jvm看到person.name = "赵晗";person通过引用new Person实例的name属性,该name属性通过地址指向常量池的"赵晗"。
- 第七步,jvm看到person.age = 18; person的age属性是基本数据类型,直接赋值。
- 第八步,jvm看到person.walk(); 调用实例的方法时,并不会在实例对象中生成一个新的方法,而是通过地址指向方法区中类信息的方法。
- 第九步,jvm看到Baby baby=new Baby().这个过程和Person person = new Person()一样
- 第十步,jvm看到baby.babyname = "赵XX";这个过程也和person.name = "赵晗";一样。
- 第十一步,jvm看到person.baby = baby;把baby对象引用赋值给Person实例的baby属性属性。
好了,到了这一步,应该对java7的内存结构有一个详细的认识
需要更多教程,微信扫码即可
用例子理解java7内存结构相关推荐
- JVM之深入理解JVM内存结构(Java内存结构/Java内存区域)、Java内存模型
Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的JVM内存结构.JAVA内存结构.JAVA内存 ...
- java 8的内存分代改进_java8的内存结构,这一篇文章就够了
在一开始学习java的时候,那时候是在网上看视频,老师就经常提到什么对象分配在堆区,什么在栈区,那时候和理解,后来理解了就想着写一篇文章好好的去梳理一下. 想说一下这篇文章的脉络: 首先,研究java ...
- [Java基础] -- Java7/8 内存结构的理解
本文转自:https://blog.csdn.net/laomo_bible/article/details/83067810 Java内存结构是每个java程序员必须掌握理解的,这是Java的核心基 ...
- js堆和栈的区别_几个例子理解不同数据类型的堆栈内存处理
如有错误烦请指正 js代码的运行环境 浏览器 内核(引擎) node webview(hybrid,嵌入到手机app里面,在app里面运行) ... 下面通过几个例子理解不同数据类型的堆栈内存处理 j ...
- java多线程构造函数_java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解...
多线程与JVM内存结构的关系[了解]: 对于最后一个有疑问的构造中stackSize参数,其实学过编程滴人从参数字面就比较容易理解,栈大小嘛,这里从官方文档上来了解一下这个参数: 而之前在学习java ...
- JVM_01 内存结构(深入理解+图解)
本文笔记参考创智播客JVM课程 和<深入理解Java虚拟机第三版> 传智播客JVM 一.JVM 入门介绍 1.1 JVM 定义 Java Virtual Machine,JAVA程序的运行 ...
- java:JVM内存结构初步理解入门:堆、栈、方法区(浅显通俗易懂自记)
自己整理的一些资料以及自己的一些理解,希望记下来的不是高大上而晦涩的概念,将自己此时此刻的理解最大程度地刻模,以便将来重温知新. JVM内存结构最简单可以初步分为:1栈 2堆 3方法区 4 程序计数器 ...
- 【Java千问】你了解Java内存结构么(Java7、8、9内存结构的区别)
Java内存结构是每个java程序员必须掌握理解的,这是Java的核心基础,对我们编写代码特别是并发编程时有很大帮助.由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是 ...
- 深入理解Java内存架构
hi,大家周末好,今天给大家带来一篇硬核的技术文章,本文我们将从计算机组成原理的角度详细阐述对象在JVM内存中是如何布局的,以及什么是内存对齐,如果我们头比较铁,就是不进行内存对齐会造成什么样的后果, ...
最新文章
- mybaits错误解决:There is no getter for property named 'parentId ' in class 'java.lang.String'
- C++ 并发编程(四):基于 Asio 的线程池
- python 函数前有一个下划线_【Python】怎么写好一个 Python 函数?
- vs2013和vs2010的配置
- 看这玩意复习你还会挂科?《软件工程2篇》
- 23个实用 Javascript Tab导航插件
- leetcode —— 687. 最长同值路径
- 001mongodb数据库介绍002mongodb的增删改查003数据导入导出
- 常用类中的方法 —— java.lang.String
- 单片机串口控制树莓派3B播放HDMI视频,omxplayer,
- 如何让Mac电脑在Finder窗口顶部显示文件路径?
- 新软件--AutoReply(自动回复),还能自动接听,做答录机
- chrome插件开发(Demo案例)
- C站能力认证(C4前端基础认证) //任务二:根据浮动布局以及定位布局的特性,实现构建下列(截图)中的页面
- 混合溶剂中的高分子凝胶中的渗透压的一般计算
- mac java 安装教程_MAC安装JDK详细教程
- 查找算法--Java实例/原理
- java黑马面试_JavaWeb-黑马面面(面试刷题系统)项目实战
- python中key=lambda_排序后的语法(key=lambda:…)
- Navicat Premium绿色版安装
热门文章
- 苹果官方首次松口:新款iPhone SE有望近期亮相
- 想换机的再等等!低价iPhone9或将推迟发布
- 微信短内容要来了!新功能已开启内测申请
- “哎哟,真的很快哦” 闪送宣布签约周杰伦为其品牌代言人
- 还有人买吗?苹果新一代iPod touch悄然发布:升级为A10芯片
- 苹果推出十年来首款游戏 “股神”巴菲特担任游戏主角
- 买写真送手机系列 小米9王源限量版预售将在这些小米之家开启
- 心痛!常德网约车司机遇害 滴滴回应:已成立应急处置小组
- php 添加 redis 扩展模块
- python实现查询mac号对应的OUI厂商信息