对象实体为什么存放在堆

前情提要,在 JVM 中,对象实体存储在 ,对象引用是存储在 。为什么这样存放呢?这背后的缘由是什么?接下来我将通过 存放 和 使用 两个角度来讲述这个问题。废话少说,立刻发车。

什么是堆栈

针对这个问题,我们首先要了解,堆、栈的数据结构。

堆的数据结构是一个特殊线性表,存取数据的原则是先进后出,最先放入的总是最后拿出来。就像我们将书本存放到箱子,最先放入的书本总是被压在最底下,最后放入的书本总是在最顶层。

栈的数据结构通常是一个完全二叉树,每一个节点存储一个值,整棵树都是经过排序的。

在此,我们着重于堆和栈的 空间分配 的。

栈的内存空间相当于一栋均匀分层的大楼,每一层都是固定的面积,想要继续扩建,只能向上建筑楼层。因此,栈的每一块内存空间都是固定大小,存储内容的能力很受局限。

堆的内存空间相当于一棵树的每片叶子,叶子的大小各异,根据环境因素各自生长。因此,堆的每一块内存空间是动态增长的,可以灵活存储不同大小的对象实体。

为什么要区分堆栈

前面说过,栈的存储能力有局限性,而堆的存储能力可以动态、灵活地增长。根据这些特性,堆比栈有更足够的空间存放对象实体;另一方面,栈存放对象引用,不仅节省空间,还可以更加灵活的使用对象实体。

如果从业务的角度理解,堆的作用是存放业务数据,栈的作用是使用业务数据实现具体的业务逻辑,不同的业务场景,使用不同的业务数据实现对应的业务逻辑。

这样设计的使对象实体的 运用 更加的灵活、隔离、模块化。

  • 灵活:相当于业务数据存放到一个空间足够的池子,我想实现怎样的逻辑,需要怎么的业务数据,通过引用的方式直接获取想要的业务数据。

  • 隔离:业务数据和业务逻辑存放在不同的空间,互不干扰。

  • 模块化:通过业务数据和业务逻辑的组合,形成具有特定功能的模块。

例子叙说

以图书馆作为例子,图书馆就是系统 全部 的内存空间,里面的任何东西都是基于图书馆来分配空间。

每一本书就是一个 对象实体,他们存放在书架上,书架就是 。假设图书馆有各种各样的书架,可以满足所有大小的书本,即使书的大小各异,管理员只需要找到合适的位置存放。

为了方便存取书本,图书馆管理员会为每一本书设计一个编号,并记录在一个表格上,编号就是对象实体的 内存地址

那什么是 对象引用 呢,答案就是读者的每一条借书记录,每一次的借书行为可以理解为对书本的一次引用。借书的记录都会登记在一个表格上,这个表格就是 。借书记录仅仅是一段文字,所需要的空间很小,而且大小基本固定,通常情况下用一个本子、一个电子表格、一个数据库,做一个表格就可以满足需求。

书本、编号、借书记录三者的结合,相辅相成,让整个图书馆的对图书的管理更加的灵活、方便和规范。

多说一句

最后,总结一下,JVM 管理对象的模式,跟图书馆管理图书的模式十分相似。其实,代码世界中很多的设计原理都是源于我们的生活,又高于生活。设计模式就在我们身边,无处不在,善于观察生活中的事物,从生活中领悟设计模式吧。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring的DI机制降低了业务对象替换的复杂性 10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部 什么是DI机制? 依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色 需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中 创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 因此也称为依赖注入。 spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。 设置注入的优点:直观,自然 构造注入的优点:可以在构造器中决定依赖关系的顺序。 什么是AOP? 面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 1.面向切面编程提供声明式事务管理 2.spring支持用户自定义的切面 面向切面编程(aop)是对面向对象编程(oop)的补充, 面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。 AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象, 是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。 aop框架具有的两个特征: 1.各个步骤之间的良好隔离性 2.源代码无关性 Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2. Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 4. 说下Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据 c) 第三方缓存的实现 5. Hibernate的查询方式 Sql、Criteria,object comptosition Hql: 1、 属性查询 2、 参数查询、命名参数查询 3、 关联查询 4、 分页查询 5、 统计函数 6. 如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6. 继承类使用显式多态 7. 表字段要少,表关联不要

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值