记录一个java对象从出生到死亡的全过程

本文解析了Java中如何创建对象,详细介绍了对象在内存中的分配情况,包括栈中的引用类型变量和堆中的对象实例,并讨论了句柄和直接指针两种访问方式的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,直接开干

public class Persion implements Serializable {
   private Integer age;
   private String name;
   private String sex;
   private String address;
   //省略set/get方法

}

public class My_Main {

    public static void main(String[] args) {
        Persion p=new Persion();// 1_2

    }

}

Notice:在这里,我们假设Persion类的编译已经完成,对于.Class文件的生成和内部结构在本篇文章中不会做过多的说明。

接下来,我们将从1_2开始谈起。对于本行的代码,从左往右阅读总共会被分为两个部分:

  1. Persion p:这个部分将会具体反映到java栈的本地变量中,作为一个引用数据类型出现。(在这里我们称之为引用类型变量p)
  2. new Persion():这个部分将会反应到java的堆中形成一块存储了Persion类型所有实例数据的结构化内存。(称之为Persion实例)

补充:我们知道,在jvm的内存结构中栈和堆是两块不同的数据块区域,在这种情况下,在1中定义的引用变量p是怎样和堆中Persion实例相关联的呢?

在java的虚拟机中有两种主流的实现方式(以下图片来源于《深入理解java虚拟机》):

  1. 使用句柄
    这里写图片描述
  2. 直接指针
    这里写图片描述

针对两种访问方式分别分析他们的优缺点:

  • 1.句柄方式:
    优点:因为句柄池的存在,所以实际的p中保存的句柄地址,在对象被移动的时候只需要改变句柄池中的内容,而无需改变p的值。
  • 2.指针方式:
    优点:因为是直接访问,所以相对来说速度更块。

相信看到这里,相信读者有了一个大概的了解。在上面的内容中,我们提到了 栈、方法区、堆 等几个概念,他们究竟是什么?有什么联系?与类对象的初始化又有什么关系?接下来,我们一起探讨。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值