Spring框架之揭秘Bean的生命周期与单例详解【面试题超详细回答】

news2025/1/22 14:49:40

目录

一、前言

1.1.介绍Spring框架和Bean的概念

二、Bean的实例化阶段

2.1.Bean的实例化过程

2.2.介绍默认构造函数和工厂方法的使用

三、Bean的初始化阶段

3.1.InitializingBean接口和@PostConstruct注解的使用

3.2.Bean的初始化方法配置和执行顺序

四、Bean的销毁阶段

4.1.DisposableBean接口和@PreDestroy注解的使用

4.2.Bean的销毁方法配置和执行顺序

五、面试题讲解

5.1.Bean的生命周期

结论:

5.2.Spring中JavaBean是单例还是多例

论证:

5.3.单例的JavaBean和多例JavaBean是什么的时候才会创建

论证:

5.4.我们使用单例一定会初始化JavaBean吗

论证:


一、前言

1.1.介绍Spring框架和Bean的概念

嘿,朋友们!让我来给大家解析一下Spring框架和Bean的故事。

Spring框架就像是一个守护神,它包揽了Java应用程序的管理工作。它有点像一场超级派对组织者,让你能够轻松地管理和控制你的应用程序。它的目标是提供一种高效、灵活的方式来构建企业级应用程序。

那么Bean又是什么呢?Bean其实就是Spring框架中的真实对象。你可以把Bean想象成小伙伴们,在Spring框架的聚会上尽情闹腾!每个Bean都有自己的生命周期,就像人类一样有出生、成长、工作和退休等阶段。

首先,Bean的实例化就像我们的诞生一样,Spring负责创建Bean对象并把它们装载到容器中。接着,Bean的属性赋值就像我们在成长过程中学习新技能一样,它们被注入各种属性,变得丰富多彩。

接下来,是Bean的初始化阶段。就像我们开始工作前需要做准备一样,Bean也可以执行一些初始化操作,包括调用特定的初始化方法,或者通过Bean后置处理器做一些善后工作。

最后,当应用程序不再需要某个Bean时,它就像我们退休一样,可以执行一些销毁操作,例如释放资源、关闭数据库连接等。

总之,Spring框架和Bean就像是一个个聚会,这些小伙伴们在其中进出各个阶段,带来欢乐和成就。不过,别担心,Spring框架是一个负责任的派对组织者,它会确保每个Bean都会得到妥善地管理和照顾!

希望这个幽默风趣的介绍让你对Spring框架和Bean有了更好的理解!

二、Bean的实例化阶段

2.1.Bean的实例化过程

Bean的实例化过程是指将定义的Bean转换为可用的对象实例的过程。在Spring框架中,Bean的实例化可以分为以下几个阶段:

  1. 加载Bean的定义:使用配置文件(如XML配置文件)或注解方式将Bean的定义加载到容器中,由Spring框架负责解析。

  2. 实例化Bean:根据Bean的定义和配置信息,在内存中创建一个Bean的实例。这可以通过构造函数实例化、工厂方法实例化或通过对象反射等方式来进行。

  3. 属性赋值:对已经实例化的Bean对象进行属性赋值,包括基本数据类型、引用类型和集合类型等。属性可以通过注解或XML配置文件进行依赖关系的注入。

  4. Aware接口回调:如果Bean实现了Aware接口,Spring会自动检测并调用相应的回调方法,例如ApplicationContextAware接口可以获取ApplicationContext对象。

  5. 自定义初始化方法:如果Bean配置了初始化方法(可以通过注解或XML配置文件),Spring会在Bean完成属性赋值后调用该方法进行一些自定义的初始化操作。

  6. 后置处理器方法调用:如果配置了Bean后置处理器(BeanPostProcessor),Spring会自动检测并调用其相关方法进行额外的处理操作。

  7. Bean准备就绪:经过以上步骤,Bean实例化过程完成,可以被容器管理和使用。

2.2.介绍默认构造函数和工厂方法的使用

默认构造函数: 默认构造函数是一个无参的构造函数,它没有任何参数传递给对象创建过程。Spring会自动调用默认构造函数来实例化Bean对象。这种方式被广泛应用,可以方便地创建对象,并且不需要通过其他方式传递参数。例如:

public class MyBean {
    // 默认构造函数
    public MyBean() {
        // 初始化操作
    }
}

工厂方法: 工厂方法是一种通过特殊的方法来实例化Bean对象的方式。通常情况下,这个方法是在一个专门的工厂类中定义的。通过工厂方法,我们可以有更多的灵活性来创建Bean对象,并且可以自定义传递参数等操作。例如:

public class MyBeanFactory {
    // 工厂方法
    public static MyBean createMyBean() {
        // 创建Bean对象的逻辑
        return new MyBean();
    }
}

示例代码:展示如何使用默认构造函数和工厂方法来实例化Bean对象:

public class MyBean {
    private String message;

    // 默认构造函数
    public MyBean() {
        this.message = "Hello, world!";
    }

    // getter和setter方法

    public static MyBean createMyBean() {
        MyBean myBean = new MyBean();
        myBean.setMessage("Hello, Spring!");
        return myBean;
    }
}

三、Bean的初始化阶段

3.1.InitializingBean接口和@PostConstruct注解的使用

InitializingBean接口使用

该接口定义了一个方法afterPropertiesSet(),当Bean的所有属性都被设置好后,Spring容器会自动调用这个方法完成初始化操作。

import org.springframework.beans.factory.InitializingBean;

public class MyBean implements InitializingBean {
    private String message;
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean: Bean is being initialized with message: " + message);
    }
}

@PostConstruct注解使用

这个注解标记在Bean的初始化方法上,表示该方法会在Bean的属性设置完成后自动执行,完成Bean的初始化操作。

import javax.annotation.PostConstruct;

public class MyBean {
    private String message;
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    @PostConstruct
    public void init() {
        System.out.println("@PostConstruct: Bean is being initialized with message: " + message);
    }
}

需要注意的是,InitializingBean接口和@PostConstruct注解可以同时使用,但这两种方式并不是必须的,您可以根据需求选择其中之一进行Bean的初始化。

在Spring中,还可以通过配置文件来指定Bean的初始化方法,在XML配置文件中使用<bean>标签的init-method属性来设置。示例如下:

<bean id="myBean" class="com.example.MyBean" init-method="init">
    <property name="message" value="Hello World" />
</bean>

3.2.Bean的初始化方法配置和执行顺序

无论是使用InitializingBean接口、@PostConstruct注解还是XML配置文件,它们都可以用来指定Bean的初始化方法,并且执行顺序是相同的:首先执行属性的依赖注入,然后执行初始化方法。

public class Example {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        MyBean bean = context.getBean(MyBean.class);
        // Bean已经被初始化完成并且可以使用
        
        ((ConfigurableApplicationContext) context).close();
    }
}

在上述示例中,创建了一个ApplicationContext对象并加载了一个XML配置文件。通过调用getBean()方法获取MyBean的实例,Spring容器会自动进行属性的注入和初始化操作。当我们关闭应用程序的时候,可以调用((ConfigurableApplicationContext) context).close()方法关闭容器。

四、Bean的销毁阶段

4.1.DisposableBean接口和@PreDestroy注解的使用

DisposableBean接口使用

该接口定义了一个方法destroy(),当Bean需要被销毁时,Spring容器会自动调用这个方法完成清理工作。示例如下:

import org.springframework.beans.factory.DisposableBean;

public class MyBean implements DisposableBean {
    private String message;
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean: Bean is being destroyed with message: " + message);
    }
}

@PreDestroy注解使用

这个注解标记在Bean的销毁方法上,表示该方法会在需要销毁Bean时自动执行,完成清理工作。示例如下:

import javax.annotation.PreDestroy;

public class MyBean {
    private String message;
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    @PreDestroy
    public void cleanup() {
        System.out.println("@PreDestroy: Bean is being destroyed with message: " + message);
    }
}

Bean的销毁也可以通过配置文件来指定Bean的销毁方法,在XML配置文件中使用<bean>标签的destroy-method属性来设置。示例如下:

<bean id="myBean" class="com.example.MyBean" destroy-method="cleanup">
    <property name="message" value="Goodbye World" />
</bean>

4.2.Bean的销毁方法配置和执行顺序

首先执行Bean的销毁方法,然后容器关闭或销毁。

public class Example {
    public static void main(String[] args) {
        // 创建并启动Spring容器
        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        // 获取Bean实例
        MyBean bean = context.getBean(MyBean.class);
        
        // 使用Bean...
        
        // 手动关闭容器
        context.close();
    }
}

在上述示例中,我们创建了一个ApplicationContext对象并加载了一个XML配置文件。通过调用getBean()方法获取MyBean的实例,Spring容器会自动执行Bean的销毁方法。当我们手动关闭容器时,可以调用context.close()方法触发Bean的销毁。

五、面试题讲解

5.1.Bean的生命周期

1.通过XML、Java annotation(注解)以及Java Configuration(配置类)等方式加载Spring Bean

2.BeanDefinitionReader:解析Bean的定义。在Spring容器启动过程中,会将Bean解析成Spring内部的BeanDefinition结构;理解为:将spring.xml中的<bean>标签转换成BeanDefinition结构有点类似于XML解析

3.BeanDefinition:包含了很多属性和方法。例如:id、class(类名)、scope、ref(依赖的bean)等等。其实就是将bean(例如<bean>)的定义信息存储到这个对应BeanDefinition相应的属性中例如:

<bean id="" class="" scope=""> -----> BeanDefinition(id/class/scope)

4.BeanFactoryPostProcessor:是Spring容器功能的扩展接口。

注意:

1)BeanFactoryPostProcessor在spring容器加载完BeanDefinition之后,

在bean实例化之前执行的

2)对bean元数据(BeanDefinition)进行加工处理,也就是BeanDefinition

属性填充、修改等操作

5.BeanFactory:bean工厂。它按照我们的要求生产我们需要的各种各样的bean。

例如:

BeanFactory -> List<BeanDefinition>

BeanDefinition(id/class/scope/init-method)

<bean class="com.zking.spring02.biz.BookBizImpl"/>

foreach(BeanDefinition bean : List<BeanDefinition>){

   //根据class属性反射机制实例化对象

   //反射赋值设置属性

}

6.Aware感知接口:在实际开发中,经常需要用到Spring容器本身的功能资源

例如:BeanNameAware、ApplicationContextAware等等

BeanDefinition 实现了 BeanNameAware、ApplicationContextAware

7.BeanPostProcessor:后置处理器。在Bean对象实例化和引入注入完毕后,在显示调用初始化方法的前后添加自定义的逻辑。(类似于AOP的绕环通知)前提条件:如果检测到Bean对象实现了BeanPostProcessor后置处理器才会执行Before和After方法

BeanPostProcessor

1)Before

2)调用初始化Bean(InitializingBean和init-method,Bean的初始化才算完成)

3)After

8.destory:销毁

结论:

1.xml/annotation/configuation 配置JavaBean。

2.BeanDefinitionReader解析配置的Javabean得到BeanDefinition,最终得到一个List集合。

3.触发BeanFactoryPostProcessor,JavaBean初始化之前执行自己的业务。

4.spring中的beanFactory,会通过List<BeanDefinition>集合遍历初始化所有的JavaBean对象(反射实例化)。

5.如果我们自己的JavaBean需要调动spring上下文中的资源,那么需要实现*Aware感知接口

6.如果自己的JavaBean已经初始化好了,还需要做扩展,那么需要借助BeanPostProcessor来实现。

7.销毁(destory)。

5.2.Spring中JavaBean是单例还是多例

1.默认是单例的,但是可以配置多例

2.单例的优点,节约内存,弊端是有变量污染(多例的优点是无变量污染,但是极其消耗内存)

一个简短风趣的故事来表达单例和多例的区别以及各自的优缺点。


在一个奇幻的魔法学校里,有一位特殊的老师叫做“魔力曼”。他拥有超强的魔法能力,并且负责教授学生们各种神奇的法术。

对于魔力曼来说,他是一个不折不扣的单例。整个学校只有他一个人具备如此强大的魔法力量,每个学生和教职员工都会向他寻求帮助和指导。他总是被围绕在学校的中心,众人都追捧他的存在。

然而,由于魔力曼的特殊地位,他的魔法力量渗透到了整个学校的环境中。无论是在课堂上还是在学校其他地方,都充满了他独特的魔法气息。有时候,当学生们试图施展自己的法术时,结果却受到了魔力曼的力量影响,产生了意想不到的效果。

相比之下,还有一位老师叫做“多地云”。她是一个多例,每个班级都能找到她的身影。她拥有温和而灵活的魔法力量,善于根据学生的需求和情况进行调整。

当学生们在多地云的指导下施展法术时,她会根据不同的班级环境和需求,帮助他们发挥出最大的潜力。由于她的魔法力量不会污染其他班级的影响,所以学生们能够更加自由地探索和发展自己的魔法技能。

这个故事告诉我们,单例和多例各有优缺点。单例的优势在于集中管理和权威性,但也容易产生变量污染的问题。而多例则可以为不同场景提供定制化的服务,避免了变量污染的潜在问题。

在设计软件时,我们应该根据具体需求选择适合的模式。对于需要全局统一访问和共享资源的情况,可以使用单例。而对于需要灵活、无变量污染的场景,多例会是更好的选择。我们需要平衡单例和多例的优缺点,并根据具体需求做出明智的选择。

论证:

ParamAction.java

package com.csdn.xw.aop.beanLife;

import java.util.List;

public class ParamAction {
	private int age;
	private String name;
	private List<String> hobby;
	private int num = 1;
	// private UserBiz userBiz = new UserBizImpl1();

	public ParamAction() {
		super();
	}

	public ParamAction(int age, String name, List<String> hobby) {
		super();
		this.age = age;
		this.name = name;
		this.hobby = hobby;
	}

	public void execute() {
		// userBiz.upload();
		// userBiz = new UserBizImpl2();
		System.out.println("this.num=" + this.num++);
		System.out.println(this.name);
		System.out.println(this.age);
		System.out.println(this.hobby);
	}
}

spring-context.xml

  <bean id="paramAction" class="com.csdn.xw.aop.beanLife.ParamAction">
        <constructor-arg name="name" value="三丰"></constructor-arg>
        <constructor-arg name="age" value="21"></constructor-arg>
        <constructor-arg name="hobby">
            <list>
                <value>抽烟</value>
                <value>烫头</value>
                <value>大保健</value>
            </list>
        </constructor-arg>
    </bean>

Test测试类

package com.csdn.xw.aop.beanLife;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/*
 * spring	bean的生命週期
 * spring	bean的單例多例
 */
public class Demo2 {
	// 体现单例与多例的区别
	@Test
	public void test1() {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
//		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
		ParamAction p1 = (ParamAction) applicationContext.getBean("paramAction");
		ParamAction p2 = (ParamAction) applicationContext.getBean("paramAction");
		// System.out.println(p1==p2);
		p1.execute();
		p2.execute();
		
//		单例时,容器销毁instanceFactory对象也销毁;多例时,容器销毁对象不一定销毁;
		applicationContext.close();
	}

	// 体现单例与多例的初始化的时间点 instanceFactory
	@Test
	public void test2() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
	}

	// BeanFactory会初始化bean对象,但会根据不同的实现子类采取不同的初始化方式
	// 默认情况下bean的初始化,单例模式立马会执行,但是此时XmlBeanFactory作为子类,单例模式下容器创建,bean依赖没有初始化,只有要获取使用bean对象才进行初始化
	@Test
	public void test3() {
		// ClassPathXmlApplicationContext applicationContext = new
		// ClassPathXmlApplicationContext("/spring-context.xml");

		Resource resource = new ClassPathResource("/spring-context.xml");
		BeanFactory beanFactory = new XmlBeanFactory(resource);
//		InstanceFactory i1 = (InstanceFactory) beanFactory.getBean("instanceFactory");
		
	}

}

运行结果:

这一次我们手动设置为多例scope="prototype"再看看

5.3.单例的JavaBean和多例JavaBean是什么的时候才会创建

 单例:JavaBean跟着Spring上下文初始化,容器生对象生,容器死对象死

 多例:JavaBean是使用的时候才会创建,销毁跟着JVM走

论证:

InstanceFactory.java

package com.csdn.xw.aop.beanLife;

public class InstanceFactory {
	public void init() {
		System.out.println("初始化方法");
	}

	public void destroy() {
		System.out.println("销毁方法");
	}

	public void service() {
		System.out.println("业务方法");
	}
}

spring-context.xml

  <bean id="instanceFactory" class="com.csdn.xw.aop.beanLife.InstanceFactory"
          scope="prototype" init-method="init" destroy-method="destroy"></bean>

可以看到上面的xml配置的是多例的,我们调用一下test2看我们的"Bean初始化"了没有?

可以看到并没有,因为我们只是获取spring的上下文对象而没有去获取Bean对象,现在我们换成单例scope="singleton"来看看结果。

 这时候我们发现不管我们有无获取Bean对象,都已经创建JavaBean了。

总结:为什么单例是容器创建完了它就初始化了呢?因为单例的思想是不管你什么时候用都要去创建,要是等你浏览器发个请求,再去创建是非常降低用户的体验感,反正只会创建一次何不在你启动项目的时候就创建好了,把时间的消耗放到了启动项目上。如果是多例,有一百个你就创建一百个吗?一千个你也创建一千个,万一我一千个我只使用一个呢?剩下的九百九十九个就是浪费了,所以,多例只会在你使用的时候创建。

5.4.我们使用单例一定会初始化JavaBean吗

BeanFactory会初始化bean对象,但会根据不同的实现子类采取不同的初始化方式,默认情况下bean的初始化,单例模式立马会执行,但是此时XmlBeanFactory作为子类,单例模式下容器创建,bean依赖没有初始化,只有要获取使用bean对象才进行初始化。

论证:

调用test3查看一下结果

XmlBeanFactory作为子类,单例模式下容器创建,bean依赖没有初始化,那我们获取并使用一下

 这时候Bean就被创建了。

到这里我的分享就结束了,欢迎到评论区探讨交流!!

如果觉得有用的话还请点个赞吧 ♥  ♥

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

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

相关文章

数据库变革:HashData云数仓实现事务级实时性

8月16-18日&#xff0c;第十四届中国数据库技术大会&#xff08;DTCC 2023&#xff09;在北京召开。酷克数据资深解决方案架构师陈义贤在“数据库内核•技术创新”专场发表题为“分布式数仓的TP能力探索—HashData UnionStore”的演讲&#xff0c;介绍HashData以Log is databas…

QT的mysql(数据库)最佳实践和常见问题解答

涉及到数据库&#xff0c;首先安利一个软件Navicat Premium&#xff0c;用来查询数据库很方便 QMysql驱动是Qt SQL模块使用的插件&#xff0c;用于与MySQL数据库进行通信。要编译QMysql驱动&#xff0c;您需要满足以下条件&#xff1a; 您需要安装MySQL的客户端库和开发头文件…

三生ONE物,无限可能|博睿数据上市三周年!

2020年8月17日&#xff0c;北京博睿宏远数据科技股份有限公司作为国内A股市场上的“APM应用性能监控第一股”公司&#xff0c;在科创板荣登上市&#xff01;&#xff08;股票号688229&#xff09; 2023年8月17日&#xff0c;三载日夜更替&#xff0c;博睿一路砥砺前行&#xf…

Eclipse集成MapStruct

Eclipse集成MapStruct 在Eclipse中添加MapStruct依赖配置Eclipse支持MapStruct①安装 m2e-aptEclipse Marketplace的方式安装Install new software的方式安装&#xff08;JDK8用到&#xff09; ②添加到pom.xml 今天拿到同事其他项目的源码&#xff0c;导入并运行的时候抛出了异…

Channel是什么?FileChannel类的常用方法

Channel 是一个接口对象,它类似于传统的流对象,但与传统的流对象又有些不同&#xff0c;具体表现如下: • Channel可以异步地执行I/O读写操作。 • Channel的读写操作是双向的,既可以从 Channel中读取数据,又可以写数据到Channel,而流的读写操作通常都是单向的。 • Channel…

Can‘t find end of central directory : is this a zip file ? at XMLHttpRequest

导出woed出现这个报错,原因其实很简单,路径写错了, 这个word首先必须是docx格式,然后必须放在public文件包下 如果放在public文件包下还没有用,则放在public包下 参考帖子: https://www.cnblogs.com/hejun26/p/13647927.html

VR漫游:720度实景参观,打造魅力生态小区

随着城市的不断发展&#xff0c;小区的建设越发具有生态化、绿色化的特点&#xff0c;人们也会偏向选择更加适合居住的小区。为了让更多的用户体验小区的舒适性&#xff0c;不少地产开发商准备引入VR漫游技术。 VR漫游不仅能够真实地展示现场环境&#xff0c;还可以改变传统网络…

shell编程 基础

将content.txt文件中的内容输出到控制台上 将content.txt中有tom的行输出到控制台 将$2文件中含有gree的行输出到控制台 case语法 简易计算器 查找有root的行 查找以root开头的行 查询时忽略大小写 grep -E 则适用于复杂的正则表达式&#xff0c;可以使用多项选择、重复和子表达…

开发者不可错过的提效工具——低代码开发

开发者不可错过的提效工具 基础低码功能及搭建 01、代码生成器 02、工作流程 03、门户设计 04、大屏设计 05、报表设计 06、第三方登录 07、多租户实现 08、分布式调度 为什么低码平台能够成为开发者的宠儿&#xff1f; 1.低码平台能够大幅提高开发效率 2.低码平台具备高度的可…

QString常用函数介绍

此篇博客核心介绍QT中的QString类型的常用函数&#xff0c;介绍到的函数均从帮助手册或其他博客中看到 QString 字符串类 Header: #include qmake: QT core 一、QString字符串转换 1、QString类字符串转换为整数 int toInt(bool *ok Q_NULLPTR, int base 10) cons…

NOTA标记多肽氨基酸试剂,NOTA-E(cRGDfK)2的化学特性

今日文章关键词&#xff1a;DOTA 偶联肽&#xff0c;NOTA-E(cRGDfK)2&#xff0c;NOTA标记多肽氨基酸试剂 产品描述&#xff1a;DOTATATE acetate 是一种 DOTA 偶联肽&#xff0c;可以被放射性核素标记以用于正电子发射断层扫描 (PET) 成像和肽受体放射性核素治疗 (PRRT)。 英…

LLM的生成配置中参数含义

LLM的生成配置中参数含义 我们在Huggingface中第一次使用大模型的时候,常常会看到一些需要调整的参数,这个参数也是需要了解的。 文中都是来自对于 LLM 一些学习资料的整理 在上图中有 4 个配置的参数分别是 Max new tokens、top-k、top-p以及 Temperature。 token相信大家都…

idea 转换为 Maven Project 的方法

选项&#xff1a; Add as Maven Project

Android 12 源码分析 —— 应用层 一(SystemUI准备篇)

Android 12 源码分析 —— 应用层一&#xff08;SystemUI准备篇&#xff09; 在接下来的时间中&#xff0c;将会使用Pixel 3(blueline)作为研究对象&#xff0c;选用AOSP的android-12.0.0_r34分支作源代码。 先从android的应用层进行探析&#xff0c;然后慢慢深入android的fr…

运维节点CPU飙升问题分析

工作内容,不对外开放 前言 首先问题是这样的,周五正在写文档,突然收到了线上报警,发现cpu占用达到了90多,上平台监控系统查看容器,在jvm监控中发现有一个pod在两个小时内产生了61次youngGc一次fullGc,这个问题特别严重且少见,由于我之前也没有排查过此类问题,所以也是…

8个免费的在线思维导图制作工具推荐,节省时间提高效率!

思维导图&#xff0c;也称为心智图或思维图&#xff0c;最初由英国的心理学家Tony Buzan提出。它是一种图形化的思维工具&#xff0c;旨在帮助我们组织信息、理解知识和激发创新思维。思维导图最大特点是其中心放射式的结构。一张思维导图通常由一个中心主题发散出各个子主题&a…

真知灼见|鲸图知识图谱平台,助力金融业务深度洞察(下)

导语 大数据时代的背景下&#xff0c;数据早就成为数字经济重要的生产资料。对数据的挖掘能力成为企业数字化转型的驱动力。就金融行业来说&#xff0c;如果经营和管理方式跟不上大数据时代的发展脚步就会使得数据价值无法得到充分发挥。知识图谱作为一个结合了知识存储、知识…

HVV(护网)行动详解

前言 最近的全国护网可谓是正在火热的进行中&#xff0c;有很多网安小白以及准大一网安的同学在后台问我&#xff0c;到底什么是护网啊&#xff1f;怎么参加呢&#xff1f;有没有相关的学习资料呢&#xff1f;在下不才&#xff0c;连夜整理出来了这篇护网详解文章&#xff0c;希…

msvcp110.dll是什么意思,msvcp110.dll丢失的解决方法

装好软件或游戏之后&#xff0c;一打开就跳出各种报错信息的情况小伙伴一定见过&#xff0c;其中缺少各种msvcp110.dll文件最常见。小伙伴们一定奇怪&#xff0c;用得好好的电脑&#xff0c;怎么会缺文件呢&#xff1f;为啥其他游戏/应用就没事呢&#xff1f;其实这些“丢失”的…

java生成Excel表格

public HSSFWorkbook CreateJZZJSList() {// 绘制ExcelString fileName "自动分析详情";HSSFWorkbook wb new HSSFWorkbook();//创建工作相簿对象HSSFSheet sheet wb.createSheet(fileName); // --->创建了一个工作簿sheet.setDefaultRowHeight((short) 600);…