先看如下代码:

Person.java

public class Person {

private String name;

private int age;

static int count = 0;

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public void sayHi() {

System.out.println("姓名:"+this.name+",年龄:"+this.age);

}

}

TestPerson.java

public class TestPerson {

public static void main(String[] args) {

Person person = new Person("kallen",20);

person.sayHi();

}

}

对象初始化步骤:

1.虚拟机加载TestPerson类(包含准备,链接,初始化),提取类型信息(包含计算申请多大堆空间等),存储到方法区。

2. 通过保持在方法区的字节码(.class) 虚拟机开始执行main方法,main方法入栈(进入方法执行堆栈区)箭头①方法入栈。

3. 进入main方法的第一条指令new Person("kallen",20);虚拟机看到new 就知道要分配空间了,去方法区找Person类,没找到就装载Person类,并把Person类的类型信息存储到方法区。

通过存储在方法区中Person 类的类型信息确定了实例对象需要分配的空间大小,在堆区分配指定大小的内存,并把实例对象的成员变量初始化为默认值(int初始化为0,引用变量初始为null)。此时,实例对象的内存分配完毕。这是new操作符的第一步。

new操作的第二步开始执行,调用构造方法,完成对象的初始化工作。然后把对象在堆空间的地址赋值给引用类型变量person。整条Person person = new Person("kallen",20);指令执行完成。

4. 调用sayHi(),通过person持有的引用,找到堆中的实例对象,通过实例对象持有的本类在方法区的引用,找到本类(Person)的类型信息,然后定位到sayHi方法,sayHi方法入栈,开始执行方法中的字节码。图中箭头④调用方法。

关于JVM加载内存图学习小密招的更多相关文章

  1. Android内存优化————加载长图

    项目中总会遇到加载长图的需求,图片的长度可能是手机长度的很多倍,也就是需要通过滑动来查看图片.比较简单的实现方式就是使用ScrollView来加载长图,但是这样做有一个很严重的问题,就是内存消耗严重. ...

  2. JVM学习(二)JVM加载类

    一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

  3. Java提高篇——JVM加载class文件的原理机制

    在面试java工程师的时候,这道题经常被问到,故需特别注意. 1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后 ...

  4. JVM加载class文件的原理

    当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件.那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做[加载 ].加载完成之后,我们就可以进行一系列 ...

  5. 基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)

    基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 个人技术博客:http://www.cnblogs.com/M ...

  6. JVM加载class文件的原理机制(转)

    JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...

  7. Android 高清加载巨图方案 拒绝压缩图片

    Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自:[张 ...

  8. JVM加载类的过程,双亲委派机制中的方法

    JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载  1.1.加载 类的加载阶段,主要是获取定义此类的二进 ...

  9. 关于JVM加载class文件和类的初始化

    关于JVM加载class文件和类的初始化 1.JVM加载Class文件的原理机制 1.1.装载 查找并加载类的二进制数据 1.2.链接 验证:确保被加载类的正确性.(安全性考虑) 准备:为类的静态变量 ...

随机推荐

  1. 配置GO开发环境

    目前准备开发一套服务器的实时监控系统,经过与大佬讨论,决定选择golang作为数据的中间件. 负责接收游戏服务器的打点数据.清洗数据,入库等流程. 在github上选了一个高星的Go框架,https: ...

  2. How to run Python code from Sublime

    How to run Python Code from Sublime,and How to run Python Code with input from sublime Using Sublime ...

  3. 树的子结构(JAVA)

    树的子结构 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) public boolean HasSubtree(TreeNode root1, T ...

  4. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  5. Kettle 部署

    下载kettle包 访问https://community.hitachivantara.com/docs/DOC-1009855下载kettle包 选择想要的版本 下载zip包 解压kettle包 ...

  6. Android Studio 1.0~3.3加载android源码 笔记

    一. AS3.3上出现问题: 1. File Z:\Project\****\***\AndroidManifest.xml doesnt exist 分析引用: ------------------ ...

  7. ubuntu16.04上vue环境搭建

    $ sudo apt-get install python-software-properties $ curl -sL https://deb.nodesource.com/setup_8.x | ...

  8. Java中final、finally、finalize有什么区别?

    final.finally和finalize的区别是什么? final: 最终的意思,可以修饰类,方法和变量. 它修饰的类,不能被继承 它修饰的方法,不能被重写 它修饰的变量,不能被改变 finall ...

  9. CefSharp 与 js 相互调用

    https://blog.csdn.net/gong_hui2000/article/details/48155547

  10. 初次使用BAT,请检查Chrome浏览器和ChromeDriver兼容性

    ChromeDriver可以理解为Chrome驱动,它是架在BAT程序和Chrome之间的桥梁.但是ChromeDriver的问题是,每个版本的兼容范围很窄,通常只能兼容3个Chrome版本. 因此, ...