一文读懂Java对象的内存分配(附图详解)

avatar
avatar
云惠网小编
2846
文章
1
评论
2021年4月8日17:18:42 评论 8 次浏览 918字阅读3分3秒
摘要

本文重点介绍创建对象和使用对象的内存分配问题,我尽量用简单的方法帮助大家理解new语法背后的内存逻辑。我们来先介绍两个概念:栈内存:位于通用RAM(随机访问存储器)中,程序通过栈指针可以直接获取到存储在栈内存中的数据,运行效率仅次于寄存器。 堆内存:一种通用的内存池(也位于RAM区),用于存放所有的Java对象,运行速度要比栈内存花费更多的时间。概念是抽象的,不是很好理解,接下来通过一个具体的小案例,来揭开内存分配的神秘面纱。假如我们要设计一个图书管理系统,因此需要创建一个图书类publi

/******************************************************************************************
* 需要Java学习资料和项目外包信息的小伙伴,可以关注我的公众号【码农充电站】或者联系我的微信
* 公众号:码农充电站
* 作者微信:it1529577
*****************************************************************************************/

概念是抽象的,不是很好理解,接下来通过一个具体的小案例,来揭开内存分配的神秘面纱。假如我们要设计一个图书管理系统,因此需要创建一个图书类

  • 栈内存:位于通用RAM(随机访问存储器)中,程序通过栈指针可以直接获取到存储在栈内存中的数据,运行效率仅次于寄存器。
  • 堆内存:一种通用的内存池(也位于RAM区),用于存放所有的Java对象,运行速度要比栈内存花费更多的时间。
赋值前内存分配
赋值前内存分配

2、多个对象指向同一内存

当b=a;book1=book;之后分别修改b和book1的值,观察a和book的变化。

      3)变量就是栈内存地址的别名

我们来先介绍两个概念:

1、单个对象内存图

      2)栈内存中存放类在堆内存的首地址

由于栈内存和堆内存的原理不同,接下来对比一下,变量赋值与对象赋值之间的区别

 

赋值后内存分配​​​​​
运行结果

 当我们使用new创建一个对象时,内存中会进行如下3步操作:     

      1)使用new创建对象,在堆内存中申请Book类的内存空间

public class Book {
String bookName; //书名
Integer price; //价格
public void lendBook(){
System.out.println("借书成员方法");
}
}

运行结果截图

本文重点介绍创建对象和使用对象的内存分配问题,我尽量用简单的方法帮助大家理解new语法背后的内存逻辑。

我们借助一小段代码,来展示内存变化逻辑,请看下图

本文转自 https://blog.csdn.net/l312770312/article/details/115440729

腾讯云618
avatar
2w 字长文爆肝 JVM 经典面试题!太顶了! java

2w 字长文爆肝 JVM 经典面试题!太顶了!

如果你是中高级程序员,那我相信你一定被面试官问过JVM。下次再被问到JVM,你直接把老周的这篇文章丢给他吧!话不多说,让我们直接进入主题吧。JVM内存结构,常见异常,调优参数,调优...
腾讯云618
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: