对象的创建与OOP-Klass模型

摘要:
类变量的生命周期从程序开始运行时创建,到程序终止运行时结束!成员变量会随着成员的创建而生存,随着成员的回收而销毁。

1、JVM中OOP-KLASS模型

在JVM中,使用了OOP-KLASS模型来表示java对象,即:
1.jvm在加载class时,会创建instanceKlass,表示其元数据,包括常量池、字段、方法等,存放在方法区;instanceKlass是jvm中的数据结构;
2.在new一个对象时,jvm创建instanceOopDesc,来表示这个对象,存放在堆区,其引用,存放在栈区;它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象;instanceOopDesc对应java中的对象实例;
3.HotSpot并不把instanceKlass暴露给Java,而会另外创建对应的instanceOopDesc来表示java.lang.Class对象,并将后者称为前者的“Java镜像”,klass持有指向oop引用(_java_mirror便是该instanceKlass对Class对象的引用);
4.要注意,new操作返回的instanceOopDesc类型指针指向instanceKlass,而instanceKlass指向了对应的类型的Class实例的instanceOopDesc;有点绕,简单说,就是Person实例——>Person的instanceKlass——>Person的Class。

instanceOopDesc,只包含数据信息,它包含三部分:
1. 对象头,也叫Mark Word,主要存储对象运行时记录信息,如hashcode, GC分代年龄,锁状态标志,线程ID,时间戳等;
2. 元数据指针,即指向方法区的instanceKlass实例 (虚拟机通过这个指针来群定这个对象是哪个类的实例。)
3. 实例数据;
4. 另外,如果是数组对象,还多了一个数组长度

对象的创建与OOP-Klass模型第1张

实例说明

classModel
{
    public static int a = 1;
    public intb;
    public Model(intb) {
        this.b =b;
    }
}
public static voidmain(String[] args) {
    int c = 10;
    Model modelA = new Model(2);
    Model modelB = new Model(3);
}

对象的创建与OOP-Klass模型第2张

方法区:类信息、类变量(静态变量和常量)、方法
堆:对象、成员变量
栈:局部变量
(1)当程序运行时,首先通过类装载器加载字节码文件,经过解析后装入方法区!在方法区中存了类的各种信息,包括类变量、常量及方法。对于同一个方法的调用,同一个类的不同实例调用的都是存在方法区的同一个方法。类变量的生命周期从程序开始运行时创建,到程序终止运行时结束!
(2)当程序中new一个对象时,这个对象存在堆中,对象的变量存在栈中,指向堆中的引用!对象的成员变量都存在堆中,当对象被回收时,对象的成员变量随之消失!
(3)当方法调用时,JVM会在栈中分配一个栈桢,存储方法的局部变量。当方法调用结束时,局部变量消失!

类变量:属于类的属性信息,与类的实例无关,多个实例共用同一个类变量,存在与方法区中。类变量用static修饰,包括静态变量和常量。静态变量有默认初始值,常量必须声明同时初始化。

成员变量:属于实例的变量,只与实例有关,写在类下面,方法外,非static修饰。成员变量会随着成员的创建而生存,随着成员的回收而销毁。

局部变量:声明在方法中,没有默认初始值,随着方法的调用而创建,存储于栈中,随着方法调用的结束而销毁。

参考:Class实例在堆中还是方法区中

图解JAVA对象的创建过程

深入理解Java类型信息(Class对象)与反射机制

JAVA中类、实例与Class对象

免责声明:文章转载自《对象的创建与OOP-Klass模型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS 拼接字符串如何用VS进行程序调试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

R实战 第11篇:处理缺失值

在真实的世界中,缺失数据是经常出现的,并可能对分析的结果造成影响。在R中,经常使用VIM(Visualization and Imputation of Missing values)包来对缺失值进行可视化和插补。在使用VIM绘图时,有些绘图函数会对缺失值会自动进行插补。 缺失数据的分类: MCAR(完全随机缺失):若变量的缺失数据与其他任何观测或未观测...

shell脚本操作

Shell文件语言 终端打印输出用echo指令 echo "hello world" 变量 1 . 变量名必须是字母(a-z,A-Z) + 下划线_ 2 . 变量名中不能有标点符号 3 . 变量名中不能有空格 变量输出需要加$符号,但是=是不能加空格的 name="smile2017" #错误的形式 加了空格 name = "smile2017"...

mysql 变量声明及赋值的三种方式

  1.情景展示   在mysql中,如何申明一个变量并进行使用?   MySQL中主要有三种类型的变量:局部变量、系统变量及用户自定义变量。 2.局部变量(无前缀)   2.1 声明变量   作用域:BEGIN,END之间才能访问得到;   适用范围:可以用在存储过程或函数中;   使用前提:必须使用关键词DECLARE或者作为存储过程的输入或输出参数...

SAS | 使用SAS数据

目录 1 创建和重定义变量 2 使用SAS函数 2.1 常用SAS字符函数 2.2 常用SAS数值函数 3 IF-THEN语句 3.1 使用if-then语句(单分支) 3.2 使用if-then/else语句分组观测(双分支/多分支) 4 提取数据中的子集(if语句/delete语句) 5 使用SAS日期 5.1 常用SAS日期函数 5...

bat脚本以管理员身份运行时,目录没有定位到当前目录问题的解决方法

我们时常使用bat脚本去处理一些事情,有事bat中的命令需要以管理员的身份运行,但是运行后文件的目录自动定位到了C:Windowssystem32下,而不再脚本所在的目录下。 这是我的文件目录,WindosActive.bat脚本会读取WindosSerial.ini中的文件信息,但是脚本中的有些命令要以管理员的身份才可以正常运行。如果直接右键管理员运行...

Android面试经验汇总(一)

1. Runnable     java中有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口。     (a)用Thread类实现       publicclassThreadDemoextendsThread{            publicvoidrun() {                // do somethi...