从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?

转载自   从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?

先回顾一下Java程序执行的过程:




Java程序执行时,第一步系统创建虚拟机进程,然后虚拟器用类加载器Class Loader加载java程序类文件到方法区。


方法区放哪些东西?


存放加载过的类信息、常量、静态变量、及jit编译后的代码(类方法)等数据的内存区域。它是线程共享的。


方法区存放的信息包括:类的基本信息、运行时常量池、变量字段信息、方法信息等。这部分的详细介绍看下面链接的文章。


详细Java程序运行的内存结构介绍 点此处


简要过程:


类加载完成后,主线程运行static main()时在虚拟机栈中建栈帧,压栈。

执行到new Object()时,在堆heap里创建对象。


对象创建的过程就是堆上分配实例对象内容空间的过程,在堆中对象内存空间的具体结构如下:



对象头 这个头包括两个部分,第一部分用于存储自身运行时的数据例如GC标志位、哈希码、锁状态等信息。第二部分存放指向方法区类静态数据的指针。


实例变量 存放类的属性数据信息,包括父类的属性信息。如果是数组的实例部分还包括数组的长度。这部分内存按4字节对齐。


填充数据 这是因为虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。HotSpot VM的自动内存管理要求对象起始地址必须是8字节的整数倍。对象头本身是8的倍数,当对象的实例变量数据不是8的倍数,便需要填充数据来保证8字节的对齐。另外,堆上对象内存的分配是并发进行的.


然后执行类的构造函数初始化。


Java虚拟机规范规定该区域可抛出OutOfMemoryError。


详细步骤


例如:


Dog dog = new Dog();


当虚拟机执行到new指令时,它先在常量池中查找“Dog”,看能否定位到Dog类的符号引用;如果能,说明这个类已经被加载到方法区了,则继续执行。如果没有,就让Class Loader先执行类的加载。


然后,虚拟机开始为该对象分配内存,对象所需要的内存大小在类加载完成后就已经确定了。这时候只要在堆中按需求分配空间即可。具体分配内存时有两种方式,第一种,内存绝对规整,那么只要在被占用内存和空闲内存间放置指针即可,每次分配空间时只要把指针向空闲内存空间移动相应距离即可,当某对象被GC回收后,则需要进行某些对象内存的迁移。第二种,空闲内存和非空闲内存夹杂在一起,那么就需要用一个列表来记录堆内存的使用情况,然后按需分配内存。


对于多线程的情况,如何确保一个线程分配了对象内存但尚未修改内存管理指针时,其他线程又分配该块内存而覆盖的情况?有一种方法,就是让每一个线程在堆中先预分配一小块内存(TLAB本地线程分配缓冲),每个线程只在自己的内存中分配内存。但对象本身按其访问属性是可以线程共享访问的。


内存分配到后,虚拟机将分配的内存空间都初始化为零值(不包括对象头)。实例变量按变量类型初始化相应的默认值(数值型为0,boolan为false),所以实例变量不赋初值也能使用。接着设置对象头信息,比如对象的哈希值,GC分代年龄等。


从虚拟机角度,此时一个新的对象已经创建完成了。但从我们程序运行的角度,新建对象才刚刚开始,对象的构造方法还没有执行。只有执行完构造方法,按构造方法进行初始化后,对象才是彻底创建完成了。


构造函数的执行还涉及到调用父类构造器,如果没有显式声明调用父类构造器,则自动添加默认构造器。


到此,new运算符可以返回堆中这个对象的引用了。


此刻,会根据dog这个变量是实例变量、局部变量或静态变量的不同将引用放在不同的地方:


如果dog局部变量,dog变量在栈帧的局部变量表,这个对象的引用就放在栈帧。


如果dog是实例变量,dog变量在堆中,对象的引用就放在堆。


如果dog是静态变量,dog变量在方法区,对象的引用就放在方法区。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core MVC TagHelper实践HighchartsNET快速图表控件

ASP.NET Core MVC TagHelper最佳实践HighchartsNET快速图表控件支持ASP.NET Core。 曾经在WebForms上写过 HighchartsNET快速图表控件-开源 Highcharts的ASP.NET Web自定义控件。 今天我就来改造它,将其使用最新的TagHelper 来实践,学习TagHelper 的使用…

架构师6

系统架构师考试总结 2019年06月11日 10:48:47 devillyd2018 阅读数 103 2011年11月12日,在这个百年一遇的大单身节的第二天,我怀着无比紧张的心情走进了系统架构师的考场。 虽然暂时还不知道我的成绩,无所谓啦,虽然答的一般&…

计算机视觉论文doc,嘉炬-计算机视觉论文资料.doc

成 绩评卷人姓 名嘉炬学 号华 中 师 范 大 学研 究 生 课 程 论 文论文题目 计算机视觉技术在教育领域的应用完成时间 2015年1月15日课程名称 计算机视觉专 业 通信与信息系统年 级 2014级注:研究生须在规定期限内完成课程论文,并用A4页面打印&#xff0…

Oracle数据库基本概念理解(1)

--函数 数字转换为字符 --0 强制位数,9位数不够不显示 $美元 SELECT TO_CHAR(124.3456,0000.00) FROM dual ; SELECT TO_CHAR(124.3456,9999.99) FROM dual ; SELECT TO_CHAR(124.3456,$9999.99) FROM dual ; --日期 日期转换为字符 SELECT TO_CHAR(SYSDATE,YY…

关于Heap Dump

转载自 关于Heap DumpHeap Dump是什么? Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC&a…

使用StyleCop 进行代码评审

使用StyleCop对原代码进行审查,看编写的代码是否遵循设计规范、.Net约定和一些贯用法等。保证代码的一致性,可读性等等。 在此之前,先简单介绍下FxCop(起初只是微软内部使用的工具),一个分析托管程序集,检测…

系统架构师5 ***********那就给个合格分了。111

https://download.csdn.net/download/sun_lq/11109495 https://download.csdn.net/download/u011669055/10736374 https://download.csdn.net/download/robertsoft/10747039 十年IT从业背景,一次考试通过系统分析师(通过系统分析师的学习 ... [复制链接] 发表于 …

2012三年大专计算机试题医学,计算机原理2012年4月真题(02384)

计算机原理2012年4月真题及答案解析(02384)计算机原理2012年4月真题及答案解析(02384),该试卷为计算机原理自考历年真题试卷,包含答案及详细解析。一、单项选择题(本大题共15小题,每小题2分,共30分)在每小题列出的四个备选项中只有…

JVM内存管理------JAVA语言的内存管理概述

转载自 JVM内存管理------JAVA语言的内存管理概述引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十美的好事,在带来了便利的同时&#xf…

微软市值今天涨了 250 亿,这家离我们越来越远的公司,为什么生意反倒越来越好了?

纳德拉上台两年半,微软市值已经涨了 50% 今天早上,微软发布了今年第三季度的财报。受云计算和 Office 业务推动,财报后的盘后交易里,微软股价上涨 5.9%、市值涨了超过 250 亿美元——收购 LinkedIn 的钱差不多就回来了。 财报发布…

系统架构设计师考试 重要的部分

系统架构师考试比较的难,属于软件工程师考试中的高级考试,有选择题,分析题,论文,请坚持。 这是高产似母猪啊。 1.每天2小时,坚持了4年考过了软件设计师,系统架构师, 四年时间花了大…

计算机文化基础分析总结,《计算机文化基础实训》教学方案设计与课题分析总结.doc...

《计算机文化基础实训》教学方案设计与课题分析总结.doc《计算机文化基础一实训》教学方案设计与课题分析总结袁良风[ 】我院自开展木课题研宄工作以来,紧紧围绕“项目教学法”教学的应 用问题,积极主动地开展专题研究和教改实验,…

Oracle数据库基本概念理解(2)

--删除用户 drop user sz cascade; --创建表空间 create tablespace worktablsp datafile C:\app\lenovo\oradata\orcl\EMPTB.dbf SIZE 5MAUTOEXTEND ON; --修改表空间 ALTER tablespace worktablsp ADD datafile C:\app\lenovo\oradata\orcl\EMPTB.dbf SIZE 5M;--扩展数据文件…

Java中关于String类型的10个问题

转载自 Java中关于String类型的10个问题1. 如何比较两个字符串?用“”还是equals 简单来说,“”是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等。只要你想检测俩字符串是不是相等的&#xff…

[ASP.NET Core] Static File Middleware

前言 本篇文章介绍ASP.NET Core里,用来处理静态档案的Middleware,为自己留个纪录也希望能帮助到有需要的开发人员。 ASP.NET Core官网 结构 一个Web站台最基本的功能,就是在接收到从「浏览器传入」的HTTP Request封包后,将站台内所…

JVM 优化经验总结

转载自 JVM 优化经验总结开始之前 Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码 (字节码), 就可以在多种平台上不…

2016年10月20日 .NET Core 1.0.2 更新

我们今天发布了一个更新,解决了在macOS Sierra系统上安装的问题。 更改仅限于macOS安装程序。 运行时或工具没有更改; .NET Core 1.0.1仍是Windows和Linux的最新版本,最新的Microsoft.NETCore.App版本仍为1.0.1。 您现在可以下载更新的.NET Core 1.0.2 m…

window7连接其他计算机的打印机,win7系统电脑怎样连接其它电脑上在打印机?

2017-12-02 回答方法/步骤1第一步:设置共享打印机电脑。(a电脑)单击【开始】-【设备和打印机】或点击【开始】/【控制面板】/【硬件和声音】/【设备和打印机】,打开【添加设备】和【添加打印机】窗口,如图1所示2设置要共享的打印机&#xff0…

系统架构设计师考试999999999999

系统架构师考试比较的难,属于软件工程师考试中的高级考试,有选择题,分析题,论文,请坚持。 这是高产似母猪啊。 1.每天2小时,坚持了4年考过了软件设计师,系统架构师, 四年时间花了大…

Java启动参数与内存调优一些学习笔记

转载自 Java启动参数与内存调优一些学习笔记 .参数的含义-Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存,按需分配 -XX:PermSize64M JVM初始分配的非堆内存 -XX:MaxPermSize128M JVM最大允许分配的非堆内存,按需分配 JVM内存模型 …