当前位置: 首页 > news >正文

面向对象03:创建对象内存分析

  本节内容视频链接:面向对象06:创建对象内存分析_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV12J41137hu?p=65&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5         创建对象时的内存分析涉及到理解对象如何在内存中分配和管理。‌这个过程在不同的编程语言和环境中可能会有所不同,‌但基本的原理是相似的。‌Java的内存管理机制相对清晰易懂。‌

1. 对象创建过程

当创建一个对象时,‌例如使用new关键字在Java中创建一个对象,‌以下步骤会发生:‌

-‌类加载‌:‌如果该类还没有被加载到JVM中,‌它首先会被加载。‌
-‌分配内存‌:‌JVM会在堆(‌Heap)‌上为对象分配内存。‌
-‌初始化‌:‌对象的字段会被初始化,‌如果声明了构造器(‌Constructor)‌,‌它也会被调用。‌
-‌返回引用‌:‌创建对象后,‌会返回一个引用,‌指向堆上的对象。‌

2. 内存分配细节

-‌堆(‌Heap)‌‌:‌这是Java用来存放创建好的对象实例的内存区域,‌无论哪个线程创建的对象,‌都存放在堆上。‌
-‌栈(‌Stack)‌‌:‌当调用一个方法时,‌会在栈上创建一个栈帧(‌Stack Frame)‌,‌用来存储局部变量、‌操作数栈和方法出口等信息。‌对象的引用通常存储在栈上。‌

3. 对象的内存布局

在JVM中,‌对象在内存中的布局通常包括:‌

-‌对象头(‌Object Header)‌‌:‌包含两部分信息,‌一部分是存储对象自身的运行时数据,‌如哈希码、‌GC分代年龄等;‌另一部分是类型指针,‌指向对象的类元数据,‌JVM通过这个指针来确定对象是哪个类的实例。‌
-‌实例数据(‌Instance Data)‌‌:‌存放类的属性数据,‌包括父类的属性。‌
-‌对齐填充(‌Padding)‌‌:‌由于JVM要求对象的大小必须是8字节的整数倍,‌如果实例数据部分没有对齐,‌就需要通过对齐填充来补全。‌

4. 垃圾回收

在JVM中,‌垃圾回收(‌GC)‌负责回收不再被使用的对象占用的内存。‌有多种垃圾回收算法和回收器,‌它们以不同的方式确定对象是否“存活”。‌

理解对象创建和内存分配的过程对于编写高效、‌易于维护的代码至关重要。‌在不同的编程语言和环境中,‌这些概念的具体实现可能有所不同,‌但基本的原理是相通的。‌

5.代码示例分析:

package oop;import oop.Demo02.Pet;public class Application {public static void main(String[] args) {Pet dog = new Pet();Pet cat = new Pet();dog.name = "旺财";dog.age = 3;dog.shout();System.out.println(dog.age);System.out.println(dog.name);}
}
package oop.Demo02;public class  Pet {public String name;public int age;public void shout(){System.out.println("叫了一声");}
}

1、当程序运行时首先在方法区加载Application类、Pet类

2、当使用Pet dog = new Pet();创建对象时,会在堆上为对象dog分配内存;

3、同时对象dog的字段(属性、方法)也会被初始化,如果声明了构造器(‌Constructor)‌,‌它也会被调用。

4、在栈上会创建一个dog:引用对象变量名,指向堆上的对象。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt第十八章 XML和Json格式解析
  • 理解Flink数据流图
  • Java码农35岁之后只能送外卖?
  • 人工智能初学者学习路线
  • 设计模式-创建型模式-建造者模式
  • 用 Postgres 就好
  • 对于mp4 android可以正常播放 ios和mac safari不能播放问题处理
  • 研究人员利用ChatGPT的强大功能,创建数字病理学AI工具
  • 前端入门:HTML5全攻略
  • Tomcat 优化
  • LWIP相关知识
  • Java常见算法
  • 光储充能源站微电网及其控制综述入门研究笔记
  • 【Qt】输入类控件QDateTimeEdit
  • IO进程(8)
  • SegmentFault for Android 3.0 发布
  • $translatePartialLoader加载失败及解决方式
  • Angular 2 DI - IoC DI - 1
  • Codepen 每日精选(2018-3-25)
  • codis proxy处理流程
  • HashMap ConcurrentHashMap
  • If…else
  • java多线程
  • Python爬虫--- 1.3 BS4库的解析器
  • WePY 在小程序性能调优上做出的探究
  • 阿里云购买磁盘后挂载
  • 工作中总结前端开发流程--vue项目
  • 浏览器缓存机制分析
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 原生 js 实现移动端 Touch 滑动反弹
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 阿里云服务器如何修改远程端口?
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​用户画像从0到100的构建思路
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (06)Hive——正则表达式
  • (编译到47%失败)to be deleted
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (九)One-Wire总线-DS18B20
  • (论文阅读11/100)Fast R-CNN
  • (十三)Flask之特殊装饰器详解
  • (一) springboot详细介绍
  • (转)大道至简,职场上做人做事做管理
  • .“空心村”成因分析及解决对策122344
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Framework杂记