java程序执行过程:

对象头 这个头包括两个部分,第一部分用于存储自身运行时的数据例如GC标志位、哈希码、锁状态等信息。第二部分存放指向方法区类静态数据的指针。并发
实例变量 存放类的属性数据信息,包括父类的属性信息。若是是数组的实例部分还包括数组的长度。这部份内存按4字节对齐。线程
填充数据 这是由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。HotSpot VM的自动内存管理要求对象起始地址必须是8字节的整数倍。对象头自己是8的倍数,当对象的实例变量数据不是8的倍数,便须要填充数据来保证8字节的对齐。另外,堆上对象内存的分配是并发进行的.3d
- 当虚拟机执行到new指令时,它先在常量池中查找“Dog”,看可否定位到Dog类的符号引用;若是能,说明这个类已经被加载到方法区了,则继续执行。若是没有,就让Class Loader先执行类的加载
-
会根据dog这个变量是实例变量、局部变量或静态变量的不一样将引用放在不一样的地方:指针
若是dog局部变量,dog变量在栈帧的局部变量表,这个对象的引用就放在栈帧。orm
若是dog是实例变量,dog变量在堆中,对象的引用就放在堆。对象
若是dog是静态变量,dog变量在方法区,对象的引用就放在方法区。blog
关于在java中建立对象时内存的分配过程,须要理解下面几点:
- 局部变量存在栈内存中;
- new 出来的对象存在也堆内存中(类是对象的模板);
- 常量存在于方法区中,方法区也在堆内存中;
- 从main方法开始执行。
下面是执行到每一句代码的时候对应的内存的分配过程
- Computer computer = new Computer();
首先在方法区找是否完成对类信息的加载,若是是的话直接用,否的话先由类加载器加载类信息。进程
局部变量computer放栈中,指向堆中的对象,对象的值为初始值,以下图:
二、computer.brand = "联想";
computer.cpuSpeed = 100;
赋值以下图(操做对象就是操做对象的地址):