先看如下代码:

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. js练习

    /** * Created by bianxiaoling on 2018/9/7. */ // 获取 url 中的参数 // 1. 指定参数名称,返回该参数的值 或者 空字符串 // 2. 不指定参 ...

  2. ios-Nav右上角按钮

    右上角的设置按钮 //****************** 右上角保存按钮 ****************** UIButton *rightBtn = [UIButton buttonWithTy ...

  3. JAVA工具类-StrUtils

    public class StrUtils { public static final String UTF_8 = "UTF-8"; /** * 去掉小数字符串后面无用的零 */ ...

  4. 285款photoshop烟花笔刷

    这是一套非常漂亮的PS烟花笔刷,包含285款不同形状效果的笔刷样式,此套photoshop烟花笔刷非常容易使用,使用可以将它们用作照片叠加,用于数码照片处理,作为游戏或艺术品的视觉效果,以及作为装饰元 ...

  5. python如何输出文件的年月日

    import time print('{}BiasedMF312and4414_rt.txt'.format(time.strftime("%Y-%m-%d"))) 输出: 201 ...

  6. 使用Python matplotlib做动态曲线

    今天看到“Python实时监控CPU使用率”的教程: https://www.w3cschool.cn/python3/python3-ja3d2z2g.html 自己也学习如何使用Python ma ...

  7. oc 语法基础

    1:https://mp.weixin.qq.com/s/IqICB4aW2vZdU0382S9sTA  <1-7高质量OC代码> 2:https://blog.csdn.net/qq_3 ...

  8. sqlhelper类,C#事务入库

    sql公共类: namespace Job.Common { public enum DataOption { Select = , Create, Update, Delete, Login } p ...

  9. Windows10上桌面共享

    Windows自带的桌面共享软件 命令行输入: Msra.exe

  10. Elasticsearch-6.7.0系列(五)5044端口 logstash安装

    centos7环境 下载logstash wget https://artifacts.elastic.co/downloads/logstash/logstash-6.7.0.tar.gz      ...