《JVM》(四)Class类文件结构,对象的创建

Class类文件结构

class文件是一组以8字节为单位的二进制流,只有两种数据类型:无符号数(基本数据类型),表(复合数据类型)

魔数

版本号

常量池(占class空间最大的数据之一,从1开始计数)

1.字面量 :接近于java层面的常量概念,如字符串,声明为final的常量

2.符号引用:类和接口的全限定名,字段和方法的描述符

字段描述符:描述字段数据类型

方法描述符:描述方法参数列表和返回值

访问标志

类索引,父类索引,接口索引集合

字段表集合(描述接口或类中声名的变量,不包括方法中的局部变量)

方法表集合

属性表集合(如,方法表,属性表都可以带有自己的属性表,如code属性存方法的代码信息)

对象的创建(非Class类对象)

0.准备工作,这个指令的参数是否可以在常量池中定位到一个类的符号引用,检查这个类是否已经被加载,解析初始化,如果没有,先执行相应的类加载过程

1.分配内存(堆中)

2.分配的内存空间都初始化为零值

3.init根据程序员的意愿初始化

分配内存

对象所需内存的大小在类加载完成后便完全确定(JVM可以通过普通Java对象的类元数据信息确定对象大小);

为对象分配内存相当于把一块确定大小的内存从Java堆里划分出来

1. 指针碰撞

如果Java堆是绝对规整的:一边是用过的内存,一边是空闲的内存,中间一个指针作为边界指示器;

分配内存只需向空闲那边移动指针,这种分配方式称为"指针碰撞"(Bump the Pointer);

2. 空闲列表

如果Java堆不是规整的:用过的和空闲的内存相互交错;

需要维护一个列表,记录哪些内存可用;

分配内存时查表找到一个足够大的内存,并更新列表,这种分配方式称为"空闲列表"(Free List);

Java堆是否规整由JVM采用的垃圾收集器是否带有压缩功能决定的;

所以,使用Serial、ParNew等带Compact过程的收集器时,JVM采用指针碰撞方式分配内存;而使用CMS这种基于标记-清除(Mark-Sweep)算法的收集器时,采用空闲列表方式;

对象的访问定位

1.通过句柄访问对象

好处:reference中存的是稳定的句柄地址,在GC时对象被移动只会改变实例数据指针,而reference本身不需要改变

2.通过直接指针访问对象

好处:访问速度快

对象创建的时机

使用new关键字创建对象

使用Class类的newInstance方法(反射机制)

用Constructor类的newInstance方法(反射机制)

使用Clone方法创建对象

用(反)序列化机制创建对象

对象的初始化顺序

父类静态代码块,静态成员变量

子类静态代码块,静态成员变量

父类普通成员变量,非static代码块

父类构造函数

子类普通成员变量,非static代码块

子类构造函数

类加载的时机

new关键字实例化对象,读取或设置一个类的静态字段(被final修饰除外)、调用一个类的静态方法;

使用java.lang.reflect包的方法对类进行反射调用

初始化一个类,若其父类没有被初始,先初始化起父类

虚拟机启动时,执行的主类(含main方法的类)先初始化

比如,new一个对象,首先检查Class类是否被加载,没有,先进行类加载过程;

然后进行对象的创建,分配内存,按照顺序初始化;

再次new一个对象,检查Class类被加载过了,直接进行对象的创建;

原文地址:http://blog.51cto.com/13580976/2148191

时间: 2024-11-05 14:52:23

《JVM》(四)Class类文件结构,对象的创建的相关文章

嵌入式linux C++语言(四)——类与对象

嵌入式linux C++语言(四)--类与对象 类的设计和使用如下: #include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>using namespace std;class Stack{public:    Stack(int size=1024);    ~Stack();    void init();    bool isEmpty();    bool

C++语言学习(四)——类与对象

C++语言学习(四)--类与对象 一.构造函数(constructor) 1.构造函数简介 C++语言中,构造函数是与类名相同的特殊成员函数.在类对象创建时,自动调用构造函数,完成类对象的初始化.类对象本身是变量,在栈.堆上创建的对象,对象的成员初始化为随机值:在静态存储区创建的对象,对象的成员初始化为0. 2.构造函数的定义 构造函数声明的语法如下:classname(parameters);没有参数的构造函数称为无参构造函数.当类中没有定义构造函数(包括拷贝构造函数)时,编译器默认提供一个无

使用类的静态字段和构造函数,用Java程序实现类的对象的创建

一.实验要求 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”. 二.设计思路 1.创建一个类Find; 2.定义一个静态整型变量i,使其记录创建对象个数: 3.在程序中定义一个函数getNum(),令其返回计量值i: 4.输出对象创建个数. 三.程序流程图 四.源代码 public class Find { static int i; public Find() { i++;  //每创建一个类的对象i加1 } s

第四章 类与对象

一.面对对象编程的三个特性 封装性:经数据和对数据的操作封装在一起.通过抽象,从实例中抽取共同性质形成一般概念,例如类. 继承:子类可继承父类的属性和行为,继承父类所具有的数据和数据上的操作,同时增添子类独有的数据和数据上的操作. 多态:一是操作名称的多态,多个操作具有相同名字,这些操作所接受的消息必须不同:二是和继承有关的多态,同意操作被不同对象调用时产生不同行为. 二.类声明 类是JAVA程序的基本要素,JAVA应用程序有若干类组成,类声明的变量为对象变量. 类的定义两部分:类声明.类体 c

面向对象,元类,控制类,对象的创建

""" call 调用的意思 ? 在在对象被调用时 执行 函数 类 自定义元类 的目的 ? 1.可以通过call 来控制对象的创建过程 ? 2.可用控制类的创建过程 """ 自定义一个元类 元类也是一个类 但是需要继承type class MyMeta(type):?self 表示要创建对象的那个类(Person) *args是调用Person类时传入的参数??  def __call__(self, *args, **kwargs):??   

Java 核心技术 第四章 类与对象

类:构造对象的模板和蓝图.由类构造对象的过程称为创建类的实例. 对象的特征: 对象的行为 对象的状态 对象的标识 类之间的关系: 依赖 聚合 继承 对象与对象变量: new Date() new GregorianCalendar() new GregorianCalendar(1999, 11, 31) new GregorianCalendar(1999, Calendar.DECEMBER, 31) new GregorianCalendar(1999, Calendar.DECEMBER

Python 类与其对象的创建和应用

1.创建新类Athlete,创建两个唯一的对象实例sarah james,他们会继承Athlete类的特性 >>> class Athlete: def __init__(self,a_name,a_dob=None,a_times=[]): self.name=a_name self.dob=a_dob self.times=a_times >>> sarah=Athlete('Sarah Sweeney','2002-07-02',['2:58','2.34','1

C++知识点(四)类与对象,结构体、联合体、枚举类

对象:属性和行为:将同一类属性和行为抽象为类 1.面向对象的基本特点: 抽象:将同一类对象的共同属性和行为进行概括,形成类 封装: 将抽象出的数据.代码封装到一起,视为一个整体 增加安全性和简化编程 多态:同一名称.不同功能实现方式,减少标识符个数 继承:在已有类的基础上进行扩展,形成新的类,有利于代码重用 2.内联成员函数:类中声明定义,类外定义inline 3.构造函数: 用于对类的对象初始化,在对象创建时自动调用 没有return语句 可以有形参,可以无形参 可以是内联函数 可以重载 可以

java面向对象编程——第四章 类和对象

OO:面向对象 OOP:面向对象编程 OOA:面向对象分析 OOD:面向对象设计 结构化编程:从顶向下,将一个大问题分解成更小的任务,然后为每一个更小的任务编写一个过程.最后程序员会编写一个主过程来启动程序流程,随后根据程序流程走向,调用想要的其它过程. 对象是存在的具体实体,具有明确定义的特征和行为. 万物皆为对象,对象因我关注而产生. 面向对象:一种认识事物的方式,注重对事物整体的认知,最符合人类自然的思维习惯. 对象是数据封装的结果. 类是具有相同属性和行为的一组对象的集合. 在软件系统中

深入理解final 类String 对象的创建以及内部方法

学习过程中的笔记 : int indexOf(int ch) :获取字符在字符串中第一次出现的位置,如果不存在,则返回-1 int indexOf(int ch,int fromIndex): 从fromIndex位置开始查找,查找ch第一次出现的位置 获取位置 int indexOf(int ch) :获取字符在字符串中第一次出现的位置,如果不存在,则返回-1 int indexOf(int ch,int fromIndex): 从fromIndex位置开始查找,查找ch第一次出现的位置 in