你担心spring容器中scope为prototype的bean太大内存溢出吗?

这篇具有很好参考价值的文章主要介绍了你担心spring容器中scope为prototype的bean太大内存溢出吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

你担心spring容器中scope为prototype的bean太大内存溢出吗?

提出假设

  • 之前一直担心spring的scope为prototype的bean在一些高并发的场景下,吃不消吗,甚至会内存溢出,这样的担心不是没有道理的,(以下是假设)因为这个类型的bean每一次都会产生新的实例,如果每个实例做一些时间比较长的任务,然后它会在这段时间常驻内存。那么它会爆炸吗?
  • 猜想1. 非并发的场景下,是正常的。因为它执行完之后在内存回收的时候总是可以被回收的
  • 猜想2.高并发的场景下,会内存溢出。因为在这段执行任务的期间,有多个Bean被初始化了,内存会不断增加。

验证猜想1

  • UserLogic.java

  • @Component
    // 保证singleton每次调用userLogic的时候都是最新的userLogic,
    // 如果没有配合上面的使用,获取这个bean的时候需要根据beanName获取,beanName需要加上前缀scopedTarget
    // 如getBean(scopedTarget.userLogic)
    @org.springframework.context.annotation.Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public class UserLogic {
        private Long timeMilis;
    
        private static int _100M = 100 * 1024 * 1024;
    
        private byte[] memory = new byte[_100M];
    
        public UserLogic(){
            timeMilis = (new Date()).getTime();
        }
    
        public void printTime() {
            System.out.println(timeMilis+"");
        }
    
        public Long getTimeMilis() {
            return timeMilis;
        }
    }
    
  • UserService.java

  • @Service
    public class UserService {
        @Autowired
        UserLogic logic;
        
        public void printNowTime(){
            logic.printTime();
        }
    }
    
    
  • Test.java

  • //TODO 查看如何创建scope注解的Logic的
                service = context.getBean("userService", UserService.class);
                logger.debug("===============================first================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(3);
                logger.debug("==============================second================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(3);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(3);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(3);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(3);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(3);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(5);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(5);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(5);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(5);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(5);
    
                logger.debug("=============================== end ================================");
                service.printNowTime();
                TimeUnit.SECONDS.sleep(5);
    
  • 先测试下普通的,非高并发场景下的曲线

  • 你担心spring容器中scope为prototype的bean太大内存溢出吗?,编程学习,JAVA基础工作中实际总结,spring,原型模式,java,后端,服务器

  • 以看到,被回收掉了,与预想的一样

验证猜想2

  • 现修改UserLogic:::printTime()方法的代码

  • public void printTime() throws InterruptedException {
            Thread.sleep(1000);
            System.out.println(timeMilis+"");
        }
    
  • ConcurrentTest.java

  •  AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(WuhulalaApplication.class);
            //context.start();
            final UserService service = context.getBean("userService", UserService.class);
            for (int i = 0; i < 20; i++) {
                new Thread(() ->{
                    try {
                        service.printNowTime();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
    
            while(true){}
    
  • 果然报错
    Caused by: java.lang.OutOfMemoryError: Java heap space

    只不过这些bean执行完任务后立马释放了内存,所以曲线如下图所示[直上直下]

  • 你担心spring容器中scope为prototype的bean太大内存溢出吗?,编程学习,JAVA基础工作中实际总结,spring,原型模式,java,后端,服务器

总结

  • 以后使用scope的prototype时候一定要注意,但是本次测试也只是在极限情况下,比较难发生,但是也是有概率的

-----------------------------------------------------------------------------------

offer突击训练营简介:

1:针对不知道怎么面试,面试没有信心的小伙伴,我们会给你一个offer保障。

2:我们会监督你15-20天内把面试体系技术点掌握至少7成,这样足够你去找到满意的工作了。

3:我们是面向面试学习指导,不会带你们去写代码,会把项目真实开发的迭代过程和技术细节如何实现业务功能都详细教清楚,你能在面试中流畅表达清楚就行了,项目经验你不用担心(技术老师提供的真实项目经验肯定拿的出手),自己学和别人带着系统学,效率完全不一样。

详情请点击这里:offer突击训练营,给你一个offer的保障,求职跳槽的看过来!文章来源地址https://www.toymoban.com/news/detail-740937.html

到了这里,关于你担心spring容器中scope为prototype的bean太大内存溢出吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于Spring Bean容器的理解

    Spring Bean 对象 Spring Bean 是Spring框架中的一个核心概念。在Spring框架中,Bean是指那些组成应用程序的对象,它们由Spring IoC容器实例化、组装和管理。Bean是一个被实例化、组装和由Spring IoC容器所管理的对象。 Spring Bean 容器 Spring Bean容器是Spring框架的核心部分,负责管理应用程

    2024年01月16日
    浏览(30)
  • Spring 容器原始 Bean 是如何创建的?

    以下内容基于 Spring6.0.4。 这个话题其实非常庞大,我本来想从 getBean 方法讲起,但一想这样讲完估计很多小伙伴就懵了,所以我们还是一步一步来,今天我主要是想和小伙伴们讲讲 Spring 容器创建 Bean 最最核心的 createBeanInstance 方法,这个方法专门用来创建一个原始 Bean 实例

    2024年02月14日
    浏览(25)
  • spring高级源码50讲-1-8(spring容器与bean)

    1) 容器接口 BeanFactory 接口,典型功能有: getBean ApplicationContext 接口,是 BeanFactory 的子接口。它扩展了 BeanFactory 接口的功能,如: 国际化 通配符方式获取一组 Resource 资源 整合 Environment 环境(能通过它获取各种来源的配置信息) 事件发布与监听,实现组件之间的解耦 可以

    2024年02月10日
    浏览(23)
  • Spring——Bean注入几种方式(放入容器)

    个人博客: 全是干货,相信不会让你失望 1.XML方式注入 在现在这个Springboot横行的年代,以XML来注入的方式可能已经不多见了,因为压根用不着,但毕竟是注入方式之一也得提一提,这种方式就是依赖于XML的解析来获取我们需要注入的Bean对象 常见的方式有:set方法注入、构

    2024年02月01日
    浏览(32)
  • 将Bean注入Spring容器的五种方式

    将bean放入Spring容器中有哪些方式? 我们知道平时在开发中使用Spring的时候,都是将对象交由Spring去管理,那么将一个对象加入到Spring容器中,有哪些方式呢,下面我就来总结一下 这种方式其实也是我们最常用的一种方式,@Configuration用来声明一个配置类,然后使用 @Bean 注解

    2024年02月05日
    浏览(24)
  • Spring的加载配置文件、容器和获取bean的方式

    🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 properties文件: jdbc.properties 1.开启context命名空间 2.使用context命名空间,加载指定properties文件 3.使用属性占位符 ${} 读取properties文件中的属性 properties文件

    2024年02月15日
    浏览(30)
  • 使用@Configuration和@Bean给spring容器中注入组件

    以前我们是使用配置文件来注册bean的,现如今可以用@Configuration 来代替配置文件。

    2024年02月11日
    浏览(26)
  • Spring容器获取Bean的9种方式 | 京东云技术团队

    随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对应的Bean。 本文为大家整理汇总了常见的获取Bean的方式,并提

    2024年02月12日
    浏览(25)
  • spring boot mybatis plus mapper如何自动注册到spring bean容器

    ##@Import(AutoConfiguredMapperScannerRegistrar.class) ##注册MapperScannerConfigurer ##MapperScannerConfigurer.postProcessBeanDefinitionRegistry方法扫描注册mapper ##找到mapper候选者 ##过滤mapper 类 候选者 ##BeanDefinitionHolder注册到spring 容器

    2024年01月17日
    浏览(37)
  • 4.是人就能学会的Spring源码教程-IOC容器创建Bean对象

    我们要关注一个接口 BeanFactory ,它是Spring IOC容器的根接口,也是容器的入口。 类的描述中已经清楚的说明了: 我们来看一下这个接口里面的方法。 我们可以看到有各种各样的 getBean 方法,让我们可以从容器中获取到各种各样的Bean对象。 BeanFactory 有一个实现类 DefaultListab

    2024年02月05日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包