JVM中对象的创建与OOP-Klass模型

目录
  • JVM中OOP-KLASS模型
    • JVM中,使用了OOP-KLASS模型来表示java对象
    • instanceOopDesc,只包含数据信息,它包含三部分
    • 实例说明

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. 另外,如果是数组对象,还多了一个数组长度

实例说明

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

  • 方法区:类信息、类变量(静态变量和常量)、方法
  • 堆:对象、成员变量
  • 栈:局部变量

(1)当程序运行时,首先通过类装载器加载字节码文件,经过解析后装入方法区!在方法区中存了类的各种信息,包括类变量、常量及方法。对于同一个方法的调用,同一个类的不同实例调用的都是存在方法区的同一个方法。类变量的生命周期从程序开始运行时创建,到程序终止运行时结束!

(2)当程序中new一个对象时,这个对象存在堆中,对象的变量存在栈中,指向堆中的引用!对象的成员变量都存在堆中,当对象被回收时,对象的成员变量随之消失!

(3)当方法调用时,JVM会在栈中分配一个栈桢,存储方法的局部变量。当方法调用结束时,局部变量消失!

  • 类变量:属于类的属性信息,与类的实例无关,多个实例共用同一个类变量,存在与方法区中。类变量用static修饰,包括静态变量和常量。静态变量有默认初始值,常量必须声明同时初始化。
  • 成员变量:属于实例的变量,只与实例有关,写在类下面,方法外,非static修饰。成员变量会随着成员的创建而生存,随着成员的回收而销毁。
  • 局部变量:声明在方法中,没有默认初始值,随着方法的调用而创建,存储于栈中,随着方法调用的结束而销毁。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java编程构造方法与对象的创建详解

    java构造方法与对象的创建 可以用类来声明对象,声明对象后必须创建对象 1构造方法 首先,我们来谈谈什么叫构造方法,既然都说了这是一个构造方法,那么很显然,它本质上就是一个方法. 那么,既然作为一个方法,它应该有方法的样子吧.它除了回调一个Class();之后,也没见它有其他的定义方法的代码呀?这是因为,在未对类自定义构造方法的情况下,编译器会自动在编译期为其添加默认的构造方法 (1)程序用类创建对象时,需要使用该类的构造方法 (2)类中构造方法的名字必须和类名完全相同,而且没有类型 (3)允

  • java教学笔记之对象的创建与销毁

    本课程的目标是帮你更有效的使用Java.其中讨论了一些高级主题,包括对象的创建.并发.序列化.反射以及其他高级特性.本课程将为你的精通Java的旅程提供指导. 1. 引言 在TIOBE 编程语言排名中,Sun 公司于1995年开发的Java语言是世界上使用最广泛的编程语言之一.作为一种通用编程语言,因为强大的工具包和运行时环境.简单的语法.丰富的平台支持(一次编写,到处运行)以及的异常活跃的社区支持,Java语言对软件开发工程师极具吸引力. 在这一系列的文章中,涵盖了Java相关的高级内容,因此

  • Java中创建对象的5种方式总结

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 使用new关键字 } → 调用了构造函数 使用Class类的newInstance方法 } → 调用了构造函数 使用Constructor类的newInstance方法 } → 调用了构造函数 使用clone方法 } → 没有调用构造函数 使用反序列化 } → 没有调用构造函数

  • 浅析Java中对象的创建与对象的数据类型转换

    Java:对象创建和初始化过程 1.Java中的数据类型     Java中有3个数据类型:基本数据类型(在Java中,boolean.byte.short.int.long.char.float.double这八种是基本数据类型).引用类型和null类型.其中,引用类型包括类类型(含数组).接口类型.     下列语句声明了一些变量: int k ; A a; //a是A数据类型的对象变量名. B b1,b2,-,b10000;// 假定B是抽象类或接口. String s; 注意:从数据类型

  • JVM中对象的创建与OOP-Klass模型

    目录 JVM中OOP-KLASS模型 JVM中,使用了OOP-KLASS模型来表示java对象 instanceOopDesc,只包含数据信息,它包含三部分 实例说明 JVM中OOP-KLASS模型 JVM中,使用了OOP-KLASS模型来表示java对象 即: 1.jvm在加载class时,会创建instanceKlass,表示其元数据,包括常量池.字段.方法等,存放在方法区:instanceKlass是jvm中的数据结构: 2.在new一个对象时,jvm创建instanceOopDesc,来

  • 浅谈JVM中的JOL

    JOL简介 JOL的全称是Java Object Layout.是一个用来分析JVM中Object布局的小工具.包括Object在内存中的占用情况,实例对象的引用情况等等. JOL可以在代码中使用,也可以独立的以命令行中运行.命令行的我这里就不具体介绍了,今天主要讲解怎么在代码中使用JOL. 使用JOL需要添加maven依赖: <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-co

  • Java开发之内部类对象的创建及hook机制分析

    本文实例讲述了Java内部类对象的创建及hook机制.分享给大家供大家参考,具体如下: Java中的内部类虽然在状态信息上与其外围类在状态信息是完全独立的(可直接通过内部类实例执行其功能),但是外围类对象却是内部类对象得以存在的基础. 内部类对象生成的时候,必须要保证其能够有外围类对象进行挂靠(hook),从而java提供了严格的内部类对象生成的语法. 一般惯用两种方法,生成内部类对象. Method1: 使用  外围类实例.new  内部类名称() 的标准方法. Example 1: publ

  • 深入理解JVM之Java对象的创建、内存布局、访问定位详解

    本文实例讲述了深入理解JVM之Java对象的创建.内存布局.访问定位.分享给大家供大家参考,具体如下: 对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流程如下: 1. 类加载检查 JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执

  • Java对象在JVM中的生命周期详解

    概念 在Java中,对象的生命周期包括以下几个阶段: 创建阶段(Created) 应用阶段(In Use) 不可见阶段(Invisible) 不可达阶段(Unreachable) 收集阶段(Collected) 终结阶段(Finalized) 对象空间重分配阶段(De-allocated) Java对象在JVM中的生命周期 当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JV

  • 详解JVM的内存对象介绍[创建和访问]

    作为java程序员对应Object应该是非常熟悉的,但是对于对象在JVM中的一些情况并不是很清楚,所以本文就来记录下对象在JVM中的一些内容 对象的创建 java程序中创建对象的常用方式是: Object obj = new Object(); 该行代码的执行过程如下: 从图中我们可以发现对象创建的步骤如下 执行new执行 检查这个指令参数是否能够在常量池中定位到一个类的符号引用,并且检查这个符号引用所代表的类是否已经被加载,解析和初始化. 如果该类没有被加载则先执行类的加载操作 如果该类已经被

  • 详解jvm对象的创建和分配

    对象的创建 创建方式 1. new 关键字直接创建. new ObjectName(). 2.通过 Class 反射对象的 newInstance() 方法.ObjectName  obj  =  ObjectName.class.newInstance(). 3.通过 Class 反射对象获取 Constructor 类,再调用其 newInstance() 方法. ObjectName obj = ObjectName.class.getConstructor.newInstance().

  • 在Java中如何避免创建不必要的对象

    目录 简介 1.String和Boolean 2.自动拆箱和装箱 3.正则表达式 总结 简介 在Java开发中,程序员要尽可能的避免创建相同的功能的对象,因为这样既消耗内存,又影响程序运行速度.在这种情况下可以考虑重复利用对象. 接下来举例几种对象重复利用的场景,看看我们是不是有中招了,如果有赶紧趁着还没被发现悄悄改掉,被发现了会被diss啦! 1.String和Boolean 如下两种写法看似没有什么区别,但是如果深入jvm底层了解,我们可以利用jvm运行时常量池的特性,避免创建具有相同功能的

  • JVM中判定对象需要回收的方法

    引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,对象B由于没有被引用,没有路径可以达到对象B,对象B的引用计数就就是0,对象B就会被回收. 但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收.例如下图:对象A,对象B 循环引用,没有其他的对象引用A和B,则A和B 都不会被回收. root搜

随机推荐