带你“找对象”--Java内存分析 | 带你学《Java面向对象编程》之二

简介: Java之中类属于引用数据类型,引用数据类型最大的困难之处在于要进行内存的管理,同时在进行操作的时候也会发生有内存关系的变化,所以本次针对于之前的程序的内存关系进行一些简单的分析。

上一篇:触摸Java世界的核心:类与对象 | 带你学《Java面向对象编程》之一
【本节目标】
本章深入浅出,结合实例带你了解新建对象的过程中在物理内存上发生的故事,理解通过内存管理实现引用数据类型的流畅使用。通过本章,你将初步了解到堆内存、栈内存相关的知识,学会从内存上分析创建对象的原理,明白通过堆栈地址相互联系实现引用数据类型数据的调用原理。

2.1 对象实例化操作初步分析

范例:以下面的程序为主进行分析

public class JavaDemo {
    public static void main(String args[]) {
       Person per = new Person() ;     //声明并实例化对象
       per.name = “张三” ;
       per.age = 18 ;
       per.tell() ;            //进行方法的调用
   }
}

如果要进行内存分析,那么首先给出两块最为常用的内存空间:

  • 堆内存:保存的是对象的具体信息,在程序中堆内存空间的开辟是通过new完成的;
  • 栈内存:保存的是一块堆内存的地址,即:通过地址找到堆内存,而后找到对象内容。但是为了分析简化起见,可以简单地理解为:对象名称保存在了栈内存之中。

image.png
图一 堆内存与栈内存

清楚了以上的对应关系后,那么下面就针对于之前的程序进行分析。
Person per = new Person()

image.png
图二 对于Person per = new Person()的内存分析

per.name = “张三” ;

image.png
图三 对于per.name = “张三” ;的内存分析

per.age = 18 ;

image.png
图四 对于per.age = 18 ;的内存分析

在之前进行分析的时候可以发现对象的实例化有两种语法,一种是之前使用的声明并实例化对象,另外一种就是分步完成。
所以下面针对于分步的内存操作进行分析。
范例:定义程序代码

public class JavaDemo {
    public static void main(String args[]) {
      Person per = null;       //声明对象
      Person per = new Person() ;     //实例化对象
      per.name = “张三” ;
      per.age = 18 ;
      per.tell() ;            //进行方法的调用
  }
}

下面通过内存分析来进行解释。

image.png
图五 对于上述代码的内存分析

需要特别注意的是,所有的对象在调用类中的属性或方法的时候必须要实例化完成后才可以执行。
范例:错误的代码

public class JavaDemo {
    public static void main(String args[]) {
      Person per = null;       //声明对象
      per.name = “张三” ;
      per.age = 18 ;
      per.tell() ;            //进行方法的调用
  }
}

image.png
图六 运行结果

代码之中只是声明了对象,但是并没有为对象进行实例化,所以此时无法调用。而此时程序中出现的NullPointerException(空指向异常)就是在没有在堆内存开辟后时所产生的问题,并且只有引用数据类型存在有此问题。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:对象“变形记”--初识引用与GC | 带你学《Java面向对象编程》之三
更多Java面向对象编程文章查看此处

相关文章
|
11天前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
88 3
|
2月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
62 4
|
2月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
4月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
308 3
|
1月前
|
缓存 监控 Kubernetes
Java虚拟机内存溢出(Java Heap Space)问题处理方案
综上所述, 解决Java Heap Space溢出需从多角度综合施策; 包括但不限于配置调整、代码审查与优化以及系统设计层面改进; 同样也不能忽视运行期监控与预警设置之重要性; 及早发现潜在风险点并采取相应补救手段至关重要.
197 17
|
20天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
3月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
168 4
AI代理内存消耗过大?9种优化策略对比分析
|
2月前
|
监控 Kubernetes Java
最新技术栈驱动的 Java 绿色计算与性能优化实操指南涵盖内存优化与能效提升实战技巧
本文介绍了基于Java 24+技术栈的绿色计算与性能优化实操指南。主要内容包括:1)JVM调优,如分代ZGC配置和结构化并发优化;2)代码级优化,包括向量API加速数据处理和零拷贝I/O;3)容器化环境优化,如K8s资源匹配和节能模式配置;4)监控分析工具使用。通过实践表明,这些优化能显著提升性能(响应时间降低40-60%)同时降低资源消耗(内存减少30-50%,CPU降低20-40%)和能耗(服务器功耗减少15-35%)。建议采用渐进式优化策略。
134 1
|
2月前
|
存储 监控 算法
Java垃圾回收机制(GC)与内存模型
本文主要讲述JVM的内存模型和基本调优机制。
|
2月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。