Java对象的创建、内存分配和访问

Wesley13
• 阅读 430

Student student = new Student();

student.study();

(1)对象的创建

①检查new指令的参数是否能在常量池中定位到一个类的符号引用,检查符号引用代表的类是否已经加载、解析和初始化

  类的加载机制

②虚拟机为新生对象分配内存,对象所需内存的大小在类加载之后即可确定(从Java堆中分配一块内存)

  指针碰撞:堆内存是规整的,用过的内存放一边,空闲内存放另一边,中间放一个指针作为分界点,分配时,只需要移动指针即可

  空闲列表:堆内存是不规整的,虚拟机维护一个列表,记录那些内存是可用的,哪些内存是不可用的,分配时,从列表中找一块足够大的内存,并更新列表

    堆内存是否规整,取决于JVM采用的垃圾回收器是否有压缩整理功能

  多线程环境下,内存分配是否线程安全(虽然只是修改一个指针)?

    a.对分配内存的动作进行同步处理(CAS+失败重试)

    b.为每个线程分配一个本地线程缓冲区(TLAB)

③将分配到的内存空间初始化为零值

④设置对象的对象头

  对象是那个类的实例、如何找到对象的云数据、对象的哈希码、对象的GC分代年龄

⑤执行方法,按照程序员的意愿进行初始化

(2)对象的内存布局

①对象头

a.运行时数据:哈希码、GC分代年龄、锁状态标志、线程持有的锁等

d.类型指针,对象指向它的类元数据的指针,表明这个对象是哪个类的实例

②实例数据

程序中定义的字段(包括从父类继承的)

存储顺序:虚拟机分配策略(long/double , int , short/char , byte , boolean, 引用)、定义的顺序(父类在子类之前)

③对齐填充

(3)对象的访问定位

对象实例数据&对象类型数据

①使用句柄访问

Java堆中分配一块内存,作为句柄池

对象的引用指向稳定的句柄,对象移动只需改变句柄中实例数据指针

句柄中有指向对象实例数据和对象类型数据的指针

Java对象的创建、内存分配和访问

②直接访问

对象的引用直接指向对象实例数据

对象实例数据中有指向对象类型数据的指针

直接访问开销小

Java对象的创建、内存分配和访问

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
qchen qchen
2年前
Java中6种创建对象的方式
1、使用关键字new创建对象java//无参构造Testtest1newTest();//有参构造Testtest2newTest("小明",18);new对象过程中,底层发生了什么?1.类加载JVM检查先是否已经加载,没有则执行类加载过程2.声明类型引用声明一个Test类型的引用test3.堆内存分配类加载步骤中已确定对象所需
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java常用类(2)
三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian
浩浩 浩浩
4年前
JVM--对象创建过程
类创建总结根据new的参数在常量池种寻找一个类的符号引用,如果类没有被加载,则进行类加载、解析、初始化。<cinit
Wesley13 Wesley13
3年前
java虚拟机(三)
普通对象的创建(不包括数组和class对象):当虚拟机遇到new指令时,会在常量池中检查是否包含这个类的符号引用(全限定名),通过这个确定是否经过类加载的过程,如果true,为该对象分配内存,对象大小在类加载过程就已经确定。如果false,需要进行类加载。分配内存1、分配内存的方式:指针碰撞:如果内存
九路 九路
3年前
2 Java对象的创建过程
JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢?程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢?一对象创建的步骤1遇到new指令时,检查这个指令的参数是否能在常量池中找到一个符号引用2如果找到符号引用,就检查这个符号引用是否已经被加载,解析和初始化过3如果没有加载过,则执行类加载过程
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。