Spring 容器中的 Bean 默认是单例的,也就是说我们在使用被Spring管理的对象的时候,不需要重复创建了,从而节省空间。

举个例子:

作为一个 CRUD 攻城狮,平时开发最多的就是一个Web应用

@RestController
public class OrderController{@Autowiredprivate OrderServiceImpl orderService;@RequestMapping(value = "/hello/{orderId}",method = RequestMethod.GET)public Order getOrder(@PathVariable("orderId")Long orderId){return orderService.get(orderId);}
}@Service
public class OrderServiceImpl implements OrderService{@Autowiredprivate OrderDao orderDao;public Order get(Long orderId){return orderDao.get(orderId);}
}

Spring 启动后,所有的对象已经创建好放入了容器,看下图

但一个客户端发送请求时,Servlet容器创建一个线程1,我们知道一个线程对应一个方法栈,而一个方法对应一个栈帧,下图时请求过来时的栈状态

此时调用的方法对应的是栈中的一个个栈帧,栈帧中使用到了Spring 容器中的一些对象在哪?在堆中,也可以说Spring 容器中,还是上面图种描述的样子。

此时有一个客户端发送请求过来,Servlet容器为这个客户端创建一个线程2,然后调用方法,栈状态如下

此时理解一下各个栈帧中的对象共用堆中的对象,大家会不有个疑问,多个线程共用有个对象,线程怎么知道程序执行到哪了?会不会乱了?

大家还记得有程序计数器和方法区这两个东东么?!一个线程对应一个程序计数器,我们这里的两个线程各拥有一个程序计数器

比如我们线程1执行到 orderDao.get(orderId) 这行代码,线程2才执行到 orderService.get(orderId) ,此时各个部件状态状态如下图:

此时还有个问题,程序执行增么找到方法区的代码的呢?

其实很简单,我们以线程1为例来说,我们执行 getOrder方法对应的栈帧中不是先要从Spring容器中拿到 OrderController 对象

我们既然拿到了这个对象,是不是就可以知道其对应的Class对象了(对象.getClass()),这个Class对象可以认为就是 'OrderContoller’类对应的方法区中的字节码(.class文件)。

从 JVM 角度看 Spring 中方法执行过程和内存状态相关推荐

  1. Spring中BeanPostProcessor 执行过程

    1.刷新容器 2.在refresh()方法中 执行 // Instantiate all remaining (non-lazy-init) singletons. // 初始化剩下的非延迟加载(no ...

  2. 一个Job在OneFlow中的执行过程—中篇

    上一篇文章<一个Job在OneFlow中的执行过程-上篇>,以bottom up的角度,简单讲解了一个Job(用户定义的训练/预测任务)在Oneflow中的调用入口.数据流转过程.从pyt ...

  3. 一个Job在OneFlow中的执行过程—下篇

    本文为<一个Job在OneFlow中的执行过程>系列文章的下篇,也是最后一篇.在之前的文章<一个Job在OneFlow中的执行过程-上篇>中,从bottom up的角度,简单讲 ...

  4. 从jvm角度看懂类初始化、方法重写、重载。

    类初始化 在讲类的初始化之前,我们先来大概了解一下类的声明周期.如下图 类的声明周期可以分为7个阶段,但今天我们只讲初始化阶段.我们我觉得出来使用和卸载阶段外,初始化阶段是最贴近我们平时学的,也是笔试 ...

  5. java方法在java虚拟机中的执行过程

    概述 在之前"Java运行时内存如何分配?"这篇文章中,曾经提到过Java在执行方法时,借助于Java虚拟机栈来实现方法的调用与执行,但具体是如何执行的呢? 本篇文章就主要来解决这 ...

  6. 欧尼酱讲JVM(08)——字节码中方法内部结构的剖析

    用到的工具--Jclasslib IDEA提供了插件,很方便. 首先 先看一段代码: public class LocalVariablesTest {private int count = 0;pu ...

  7. 微信小程序 app.js中onLaunch中方法执行完毕后再执行index首页数据请求

    实际开发中遇到在app.js中onlaunch中方法未执行完毕的情况下,先进入首页执行index方法的问题.如果在onlaunch中写了自动登录的方法,会存在首页加载时显示未登录的情况(此时onlau ...

  8. spring中事务执行完成后/回滚后执行

    有时候业务场景需要 在事务结束后执行一些更新操作; 或者在事务失败回滚后执行一些更新表状态的操作; 就可以用到如下代码: @Transactional(rollbackFor = Exception. ...

  9. JVM类加载机制_字节码执行引擎_Java内存模型

    类加载机制: 类加载生命期:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Usi ...

最新文章

  1. 离开页面前显示确认提示对话框(兼容IE,firefox) = how to Catch Win...
  2. Javascript数字前补零的功能
  3. WINCE的FFMPEG交叉编译环境搭建
  4. 【Python】matplotlib可视化必知必会富文本绘制方法
  5. nginx模块_使用gdb调试nginx源码
  6. Eclipse安装zylin[转]
  7. [Java] ApplicationContext 辅助类
  8. 喂。請罘葽缺蓆涐旳以后
  9. 快速锁屏电脑快捷键_电脑系统经典常用的快捷键你知道几个呢?
  10. MySQL千万级大表优化解决方案
  11. Android 启动APP时黑屏白屏的三个解决方案
  12. day25,多继承,组合,接口,抽象类和鸭子型
  13. 创建CocoaPods的Framework Swift组件化之路(上)
  14. 邮件营销EDM运营笔记:选择合适的EDM平台
  15. 11 款用于优化、分析源代码的Java工具
  16. Windows RDS远程会话服务
  17. 解决电脑浏览器打不开网页问题
  18. 商品促销倒计时效果实现
  19. Spark SQL 初识
  20. Vue中实现图片下载到本地功能和导出(下载)excel文件功能:

热门文章

  1. html 自动滚动到底部,Javascript实现DIV滚动自动滚动到底部的代码
  2. android arcgis多变形边框颜色,Arcgis for Android 判断指定点是否在多边形内部
  3. gdbstub中的基本命令_程序员应该知道的 20 个 Linux 系统管理命令
  4. Bad Hair Day(求数组中元素和它后面离它最近元素之间的元素个数)
  5. python绘制气象等值线图_利用Python插值绘制等值线图
  6. quartz集群重复调度的解决
  7. ps 如何增加 填充图案
  8. 数据库性能自动压测-Oracle swingbench篇
  9. Servlet ---- cookie session
  10. 2021高考成绩查询。,2021高考成绩公布时间 2021高考成绩查询方式