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 Root
    private static MyService myStaticService;

    @Autowired
    private MyService myService;

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringBootGCRootDemoApplication.class, args);

        // 应用程序上下文中的Bean,GC Root
        myStaticService = context.getBean(MyService.class);
    }

    @RestController
    @RequestMapping("/api")
    public static class MyController {

        // 控制器中的依赖,GC Root
        @Autowired
        private MyService myService;

        @GetMapping("/hello")
        public String sayHello() {
            return myService.getMessage();
        }
    }

    @Service
    public 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 {
        @Autowired
        private 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 {
        @Autowired
        private MyService myService;

        @GetMapping("/hello")
        public String sayHello() {
            return myService.getMessage();
        }
    }

    @Service
    public static class MyService {
        @Autowired
        private MyMapper myMapper;

        public String getMessage() {
            MyEntity entity = myMapper.getById(1);
            return "Hello, " + entity.getName();
        }
    }

    @Mapper
    public 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.mfbz.cn/a/712986.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python自动化办公(一) —— 根据PDF文件批量创建Word文档

Python自动化办公(一) —— 根据PDF文件批量创建Word文档 在日常办公中,我们经常需要根据现有的PDF文件批量创建Word文档。手动操作不仅费时费力,而且容易出错。幸运的是,使用Python可以轻松实现这个过程。本文将介绍如…

RK3568平台(input篇)输入设备应用编程

一.输入设备介绍 输入设备其实就是能够产生输入事件的设备就称为输入设备,常见的输入设备包括鼠标、键盘、触摸屏、按钮等等,它们都能够产生输入事件,产生输入数据给计算机系统。 对于输入设备的应用编程其主要是获取输入设备上报的数据、输…

Postman使用教程(Postman详细图文教程)

本文讲解的是postman工具安装、postman安装教程、postman工具下载、postman使用教程。Postman使得得开发人员和测试人员能够更高效地与Web服务进行交互和调试。 Postman不仅支持常见的HTTP方法,如GET、POST、PUT、DELETE等,还提供了丰富的请求编辑功能&…

编译安装qemu-devel @FreeBSD

缘起 使用cbsd创建riscv jail的时候提示: you have no qemu-user, please install qemu-devle with BSD_USER and STATIC ops (emulators/qemu-devel) 使用pkg安装之后,创建的riscv jail启动报错: Starting jail: fbriscv, parallel timeo…

Qt QListView自定义树状导航控件

大部分的软件都有多个页面,这时候就需要一个导航栏控件,通过在导航栏中选择某一栏,同时显示对应的页面。 本文代码效果如下: 本文的导航栏控件基于大佬 feiyangqingyun 的导航栏控件博客Qt/C编写自定义控件46-树状导航栏_qt之实现…

计算机网络期末复习1(最后一天才开始学版)

1.一个PPP帧的数据部分(用十六进制写出)是7D 5E FE 27 7D 5D 7D 5D 65 7D 5E。试问真正的数据是(用十六进制写出) 由于PPP帧的标志字段为7E,因此,为了区别标志字段和信息字段,将信息字段中出现的每一个0x7E转变成(0x7D,0x5E),0x7…

LeetCode --- 401周赛

题目列表 3178. 找出 K 秒后拿着球的孩子 3179. K 秒后第 N 个元素的值 3180. 执行操作可获得的最大总奖励 I 3181. 执行操作可获得的最大总奖励 II 一、找出K秒后拿着球的孩子 这题可以直接模拟,从前往后,再从后往前走k次,最后直接返回…

【尚庭公寓SpringBoot + Vue 项目实战】公寓管理(十一)

【尚庭公寓SpringBoot Vue 项目实战】公寓管理(十一) 文章目录 【尚庭公寓SpringBoot Vue 项目实战】公寓管理(十一)1、业务介绍2、逻辑模型介绍3、接口开发3.1、保存或更新公寓信息3.2、根据条件分页查询详细信息3.3、根据ID获…

Carsim高级开发:VS Connect通讯开发指南

文章目录 前言一、VS Connect 概念引入二、VS Connect 通讯框架三、Carsim 工程配置1、车辆模型配置2、procedure配置3、Run Control配置4、受控车辆名称配置 四、VS Connect Server代码1、打开Sln工程2、代码修改 五、VS Connect Client代码1、函数的调用关系2、carsim_variab…

【JAVA开发笔记】实战演练,如何用EasyExcel导出表格,并且自定义合并单元格

目录 1. 前言 2. EasyExcel简介 3. EasyExcel简单导出案例讲解 3.1 EasyExcel依赖引入 3.2 测试类创建 3.3 Excel导出实现 4. EasyExcel合并单元案例讲解 4.1 实现自定义合并策略 4.2 使用自定义合并策略 5. 总结 1. 前言 项目上,需将一个列表数据导出Ex…

16. 第十六章 类和函数

16. 类和函数 现在我们已经知道如何创建新的类型, 下一步是编写接收用户定义的对象作为参数或者将其当作结果用户定义的函数. 本章我会展示函数式编程风格, 以及两个新的程序开发计划.本章的代码示例可以从↓下载. https://github.com/AllenDowney/ThinkPython2/blob/master/c…

(源码)供应商电子招投标管理系统实现方案和功能说明

采购在线招投标供应商管理系统是一个集成了多个关键功能的综合性系统,旨在优化采购流程、提高效率和确保透明度。以下是关于您提到的五个核心功能的详细解释: 供应商管理 此功能允许企业记录和管理供应商的基本信息,如公司名称、联系方式、主…

了解并解决 Flutter 中的灰屏问题

生产中的 flutter 应用程序中的灰屏是一种通用占位符,当框架遇到问题无法渲染预期用户界面时就会显示。是的,所以基本上是出现问题时的后备指示器。 有趣的是,这只出现在发布模式下。在任何其他模式下运行都会显示红色错误屏幕,并…

apt-get update和apt-get upgrade的区别

apt-get update apt-get update 命令用于更新本地软件包列表。具体来说,做了以下事情: ①从 /etc/apt/sources.list 文件和 /etc/apt/sources.list.d/ 目录下的所有文件中读取软件源配置。 ②连接到这些软件源,并下载最新的软件包列表。 ③将…

前端老古董execCommand——操作 选中文本 样式

文章目录 ⭐前言⭐exe command api用法💖 example示例💖 测试效果 ⭐execommand和getSelection 的联系⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端老古董execCommand——操作选中文本。 execommand 当一个 HTML 文…

【Linux】进程_4

文章目录 五、进程4. 进程状态5. 进程优先级6. 进程的调度和转换 未完待续 五、进程 4. 进程状态 当进程属于挂起状态时,进程的可执行程序代码和数据均会被从内存中换入到磁盘中,此时进程的PCB并没有消失,只要操作系统还需要管理这个进程&a…

ChatGPT关联技术

ChatGPT关联技术 一、前馈神经网络二、序列到序列模型(Seq2Seq)三、自注意力机制四、多头自注意力机制五、自监督学习六、Transformer模型七、语言生成技术八、多语种语言模型九、预训练语言模型十、生成式预训练模型(GPT)十一、近…

【odoo】odoo.conf文件配置

概要 odoo.conf 文件是 Odoo 服务器的配置文件,它用于定义和管理 Odoo 运行时的各种参数。这个文件包含了许多配置选项,可以帮助管理员根据特定的需求和环境来调整 Odoo 服务器的行为。 主要功能 数据库连接设置:定义 Odoo 连接到 PostgreSQL…

使用tkinter创建带有图标的菜单栏

使用tkinter创建带有图标的菜单栏 效果代码代码解析创建主窗口加载图标创建菜单栏添加文件菜单添加带图标的菜单项 Tkinter 的默认菜单外观较为简单,可以通过自定义和添加图标,让菜单显示更好看。 效果 代码 import tkinter as tk from tkinter import …

【SpringBoot】SpringBoot:构建安全的Web应用程序

文章目录 引言为什么需要安全Spring Security概述配置Spring Security添加依赖基本配置 用户认证创建用户实体类创建用户存储库自定义用户服务更新安全配置 用户授权更新用户实体类更新自定义用户服务更新安全配置 防护措施防止SQL注入使用参数化查询 防止跨站脚本(…