先看如下代码:

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. CodeForce 517 Div 2. C Cram Time

    http://codeforces.com/contest/1072/problem/C C. Cram Time time limit per test 1 second memory limit ...

  2. 用js简单实现一下迪克斯特拉算法

    今天看书看到了迪克斯特拉算法,大概用js实现一下呢,计算最短路径. 首先,迪克斯特拉算法只适用于有向无环图,且没有负权重,本例关系图如下哦,数字为权重,emmmm,画得稍微有点丑~ //大概用js实现 ...

  3. Centos7使用yum快速安装ansible

    ansible功能简介:ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量运行命令等功能.主要基于ssh实现连接各个被控制端 yum默认安装的ansible,常用的配置文件有两个,一 ...

  4. nvm 知识点

    事项 作用 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash 安装nvm comm ...

  5. sql,求和小于一定值的数据行

    select count(id),sum(Price) from [T_AddPrice] as a --order by id

  6. Python学习:函数式编程(lambda, map() ,reduce() ,filter())

    1. lambda: Python 支持用lambda对简单的功能定义“行内函数” 2.map() : 3.reduce() : 4.filter() : map() ,reduce() , filt ...

  7. 使用LFSR搭建误差补偿系统

    使用LFSR搭建误差补偿系统 首先弄明白什么是LFSR 线性反馈移位寄存器(LFSR)是内测试电路中最基本的标准模块结构,既用作伪随机测试码产生器,也作为压缩测试结果数据的特征分析器. 一个n阶的LF ...

  8. Guava - Ordering

    guava中Ordering类是对Compartor接口的实现,但它也只是一个抽象类. 当调用Ordering.natural()方法时,它就会返回一个NaturalOrdering的对象,Natur ...

  9. 用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)

    用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书) 来源: https://www.cnblogs.com/osnosn/p/10597897.html 来自osnosn的博客 ...

  10. Oracle数据库容量使用情况调查

    -- 剩余容量 select sum(bytes) FREE from DBA_FREE_SPACE where tablespace_name ='xxx'; -- 总容量 select sum(b ...