Spring Boot 项目中的 GC Root

可达性分析是一种用于判定对象是否可以被垃圾回收的算法。基本思想是通过一个称为“根集合”(GC Root)的起点集合,来追踪对象引用。如果一个对象从根集合开始可以被追踪到,那么它就是“可达”的,否则就是“不可达”的,可以被认为是垃圾,因而可以被回收。

GC Root是可达性分析的起点。在Java中,以下几种类型的对象可以作为GC Root:

  1. Java栈中的引用对象:即当前正在被调用的方法中的局部变量和输入参数。
  2. 静态属性引用的对象:即所有类的静态属性(静态变量)。
  3. 常量引用的对象:即常量池中的引用(如字符串常量)。
  4. 本地方法栈中的引用对象:即本地方法(Native方法)中引用的对象。
  5. 活动线程:所有正在运行的线程。

纯粹的Spring Boot

Spring Boot构建的软件项目中,GC Root的概念与在任何其他Java应用程序中相同,但由于Spring Boot的结构和特性,有一些特定的地方可能成为GC Root。以下是Spring Boot项目中特别需要注意的几个GC Root来源:

  1. 应用程序上下文 (Application Context)
    Spring Boot应用程序上下文持有许多Bean的引用。这些Bean通常包括服务、控制器、配置等。由于应用程序上下文是通过静态方法访问的,它们往往会作为GC Root。

  2. 静态变量
    任何静态变量都可能作为GC Root。例如,在Spring Bean中声明的静态字段或通过静态方法访问的资源。

  3. 线程池
    Spring Boot应用程序通常使用线程池来处理并发请求。线程池中的线程会引用许多对象,这些线程会作为GC Root,防止这些对象被回收。

  4. Servlet容器中的对象
    Spring Boot通常嵌入一个Servlet容器(如Tomcat、Jetty)。这些容器中的对象(如HttpSession、ServletContext等)也可能成为GC Root。

  5. JVM本地方法栈
    任何在Spring Boot应用程序中使用的JNI(Java Native Interface)调用所引用的对象,也会作为GC Root。

@SpringBootApplication
public class SpringBootGCRootDemoApplication {// 静态变量,GC Rootprivate static MyService myStaticService;@Autowiredprivate MyService myService;public static void main(String[] args) {ApplicationContext context = SpringApplication.run(SpringBootGCRootDemoApplication.class, args);// 应用程序上下文中的Bean,GC RootmyStaticService = context.getBean(MyService.class);}@RestController@RequestMapping("/api")public static class MyController {// 控制器中的依赖,GC Root@Autowiredprivate MyService myService;@GetMapping("/hello")public String sayHello() {return myService.getMessage();}}@Servicepublic static class MyService {public String getMessage() {return "Hello, World!";}}
}

在Spring Boot构建的软件项目中,结合Spring、Spring MVC、MyBatis等框架来实现三层模型(MVC模式),以下是这些框架中的一些关键组件以及它们如何成为GC Root的解释:

三层模型(MVC模式)

通常的三层架构分为:

  1. 表示层(Presentation Layer):处理用户的请求和响应。
  2. 业务逻辑层(Business Logic Layer):处理具体的业务逻辑。
  3. 数据访问层(Data Access Layer):处理数据库访问。

以下是Spring Boot项目中使用Spring、Spring MVC、MyBatis等框架时,哪些组件会成为GC Root:

表示层(Presentation Layer)

  1. Spring MVC 控制器 (Controllers)

    • 控制器类和它们的实例通常是单例(Singleton),并且由Spring容器管理。
    • 这些实例通过Spring上下文持有,会成为GC Root。
    @RestController
    @RequestMapping("/api")
    public class MyController {@Autowiredprivate MyService myService;@GetMapping("/hello")public String sayHello() {return myService.getMessage();}
    }
    
  2. Servlet 容器中的对象

    • Spring Boot内嵌的Servlet容器(如Tomcat、Jetty)会维护一些长生命周期的对象,如HttpSessionServletContext,这些也会成为GC Root。

业务逻辑层(Business Logic Layer)

  1. Spring Service 层的Bean

    • Service类通常也是单例,并且由Spring容器管理。
    • 这些Bean通过Spring上下文持有,会成为GC Root。
    @Service
    public class MyService {public String getMessage() {return "Hello, World!";}
    }
    

数据访问层(Data Access Layer)

  1. MyBatis Mapper

    • MyBatis Mapper接口的实现由MyBatis框架生成,并通过Spring容器管理。
    • 这些Mapper对象被Service层引用,而Service层又被控制器引用,间接地,这些Mapper对象会成为GC Root的一部分。
    @Mapper
    public interface MyMapper {@Select("SELECT * FROM my_table WHERE id = #{id}")MyEntity getById(int id);
    }
    
  2. 数据库连接和会话

    • 数据库连接池中的连接对象(如HikariCP、C3P0)和MyBatis的SqlSession对象,由于其生命周期管理,这些对象也会成为GC Root。

示例代码总结

以下是一个综合示例,展示Spring Boot项目中如何使用这些组件:

@SpringBootApplication
public class SpringBootGCRootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootGCRootDemoApplication.class, args);}@RestController@RequestMapping("/api")public static class MyController {@Autowiredprivate MyService myService;@GetMapping("/hello")public String sayHello() {return myService.getMessage();}}@Servicepublic static class MyService {@Autowiredprivate MyMapper myMapper;public String getMessage() {MyEntity entity = myMapper.getById(1);return "Hello, " + entity.getName();}}@Mapperpublic interface MyMapper {@Select("SELECT * FROM my_table WHERE id = #{id}")MyEntity getById(int id);}public static class MyEntity {private int id;private String name;// getters and setters}
}

总结

在Spring Boot应用中,以下组件通常会作为GC Root:

  • Spring上下文管理的控制器、服务和Mapper
  • Servlet容器中的长生命周期对象
  • 数据库连接池中的连接对象
  • 活动线程

这些组件和对象由于它们在应用程序中的关键角色,会被GC Root引用,从而不会被垃圾回收。理解这些GC Root的来源,对于调试和优化Spring Boot应用程序的内存使用非常重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot集成SSE消息推送

SSE介绍 SSE(Server-Sent Events)的全称是服务器推送事件,它是一种基于 HTTP 协议的实时通信技术,用于在客户端和服务器之间建立持久、单向的链接,允许服务器向客户端发送异步消息。 了解 websocket 的小伙伴&…

SAP BC 换了logo后,其他人的logo都已经换了,但是其中有一台就是PRD 显示DEV的logo,从smw0上下载的是PRD

昨天终于发现是缓存的问题 GUI登录后 选项-本地数据-缓存 删除本地缓存文件,问题解决了

机器学习课程复习——聚类算法

Q:什么是硬聚类,什么是软聚类? 如果一个样本只能属于一个类,则称为硬聚类(hard clustering); 如果一个样本可以属于多个类,则称为软聚类(soft clustering)。 Q:聚类和分类的区别? 聚类分类学习类型无监督学习方法 不需要事先标记的数据 通过发现数据中的模式或结构来组…

sprintboot依赖管理和自动配置

springboot依赖管理和自动配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景启动器starter场景启动器基本介绍官方提供的starter第三方starter 自动配置自动配置基本介绍SpringBoot自动配置了哪些?如何修改默认配置如何修改默认扫描包结构re…

深入解析 iOS 应用启动过程:main() 函数前的四大步骤

深入解析 iOS 应用启动过程:main() 函数前的四大步骤 背景描述:使用 Objective-C 开发的 iOS 或者 MacOS 应用 在开发 iOS 应用时,我们通常会关注 main() 函数及其之后的执行逻辑,但在 main() 函数之前,系统已经为我们…

创建最基本的web服务器-http模块

在Node.js中,可以使用内置的http模块来创建一个最基本的web服务器。以下是一个简单的示例,它创建了一个HTTP服务器,该服务器监听一个端口,并在接收到请求时发送一个“Hello, World!”的响应。 // 引入http模块 const http requi…

leetcode 二分查找·系统掌握 寻找比目标字母大的最小字母

题目: 给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个字符。 题解&…

C++及cmake语法介绍

c/cmake学习 文章目录 c/cmake学习1. c1.1 基本模型1.1.1 for循环1.1.2 main函数1.1.2 带参数函数编译函数 2. CMAKE2.1 相关命令2.1.1 编译基本命令2.1.2 动态库静态库编译2.1.3 消息输出2.1.4 cmake变量常见参数1. 设置构建类型2. 设置编译器标志3. 指定编译器4. 设置安装路径…

机器学习_PCA

目录 一、概念 二、原理 三、步骤 四、实战 1、数据处理——转rgb为灰度图像 2、手动实现pca降维 3、查看信息保留数量 4、调用第三方库实现pca降维 五、小结 引入: 当说黄河五路和渤海三路交叉口的时候,这些路就类似于我们说的坐标系。而城市中的…

高等数学笔记(三):导数

一、导数概念 1.1 导数的定义 1.1.1 函数在一点处的导数与导函数 1.1.2 单侧导数 1.2 导数的几何意义 1.3 函数可导性与连续性的关系 二、函数的求导法则 2.1 函数的和、差、积、商的求导法则 2.2 反函数的求导法则 2.3 复合函数的求导法则 2.4 基本求导法则与导数公式 三…

read code and make summer (python)

read code and make summer ==标题==:语法==标题==:类的定义==标题==:继承==标题==:多态==标题==:__all__ = [create_dataset, create_dataloader]==标题==:yield==标题==: f-string(格式化字符串)==标题==:getattr()==标题==:logging==标题==:seed==标题==:slice…

必看!!! 2024 最新 PG 硬核干货大盘点(上)

PGConf.dev(原名PGCon,从2007年至2023年)首次在风景如画的加拿大温哥华市举办。此次重新定位的会议带来了全新的视角和多项新的内容,参会体验再次升级。尽管 PGCon 历来更侧重于开发者,吸引来自世界各地的资深开发者、…

Nginx常用配置、反向代理

目录 1. 常用配置 基本设置 HTTP配置 虚拟主机配置 2. 高级配置 反向代理配置 SSL/TLS配置 负载均衡配置 1. 常用配置 基本设置 user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;user nginx;: 指定Nginx worker…

深入理解并打败C语言难关之一————指针(5)(最终篇)

前言: 仔细一想,小编已经把指针的大部分内容都说了一遍了,小编目前有点灵感枯竭了,今天决定就结束指针这一大山,可能很多小编并没有提到过,如果有些没说的小编会在后续博客进行补充道,不多废话了…

服务器数据恢复—NTFS文件系统下双循环riad5数据恢复案例

服务器存储数据恢复环境: EMC CX4-480存储,该存储中有10块硬盘,其中有3块磁盘为掉线磁盘,另外7块磁盘组成一组RAID5磁盘阵列。运维人员在处理掉线磁盘时只添加新的硬盘做rebuild,并没有将掉线的硬盘拔掉,所…

ARCGIS 如何对河流等线条图形进行Smooth处理——具有多个断点高阶版

1.线转点折点(注意!很重要,不是线转点) 2.点转线步骤 ## 3 线的融合 2.1 新建Filed 》短精度类型》利用选择工具的 线文件。全选同一条河流点,进入Tabel的选择界面。给同一条河赋值同一个值。 大功告成!…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及多类型储能调频容量动态申报的电能量与调频市场联合出清方法研究》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

深入探究RTOS的任务调度

阅读引言: 此文将会从一个工程文件, 一步一步的分析RTOS的任务调度实现, 这里选用FreeRTOS分析, 别的也差不多的, 可能在细节上有少许不一样。 目录 1, 常见嵌入式实时操作系统 2, 任务调度的…

HDFS 面试题(一)

1. 简述什么是HDFS,以及HDFS作用 ? HDFS,全称为Hadoop Distributed File System,即Hadoop分布式文件系统,是一个分布式文件系统,由Apache Hadoop项目的一部分。它被设计用来在廉价的硬件上运行&#xff0c…

练习题-18 计算两个积分

计算积分 I ∫ R e − t 4 d t . I\int_{\mathbb{R}} e^{-t^4} dt. I∫R​e−t4dt. 解:令 x t 4 xt^4 xt4. 则 I 2 ∫ 0 ∞ e − x ⋅ 1 4 ⋅ x − 3 / 4 d x 1 2 Γ ( 1 4 ) I 2\int_0^\infty e^{-x} \cdot \frac{1}{4}\cdot x^{-3/4} dx\frac{1}{2} \Gamma(…