JVM的内存结构

  • 堆(Heap):线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。
  • 方法区(Method Area):线程共享。存储类信息、常量、静态变量、即时编译器编译后的代码。
  • 方法栈(JVM Stack):线程私有。存储局部变量表、操作栈、动态链接、方法出口,对象指针。
  • 本地方法栈(Native Method Stack):线程私有。为虚拟机使用到的Native 方法服务。如Java使用c或者c++编写的接口服务时,代码在此区运行。
  • 程序计数器(Program Counter Register):线程私有。有些文章也翻译成PC寄存器(PC Register),同一个东西。它可以看作是当前线程所执行的字节码的行号指示器。指向下一条要执行的指令。

JVM的4种垃圾回收算法

1.标记清除2.复制算法3.标记整理****4.分代收集算法

redis中的数据结构

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(无序集合)及zset(有序集合)。

Spring常用注解

1、给容器中注入组件

(1)包扫描+组件标注注解

@Component:泛指各种组件

@Controller:控制层

@Service:业务层

@Repository:数据访问层

(2)@Bean

导入第三方包里面的注解

(3)@Import

@Import(要导入到容器中的组件);

(4)使用spring提供的FactoryBean(工厂Bean)

2、注入bean的注解

@Autowired:由bean提供

  • @Autowired可以作用在变量、setter方法、构造函数上;
  • 有个属性为required,可以配置为false;

@Inject: @Inject用法和@Autowired一样。

@Resource:@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的

@Primary

让spring进行自动装配的时候,默认使用首选的bean

3、@JsonIgnore

(1)作用

在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。

4、初始化和销毁方法

(1)通过@Bean(initMethod=”init”,destoryMethod=”destory”)方法

5、Java配置类相关注解

@Configuration

声明当前类为配置类;

@Bean

注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式;

@ComponentScan

用于对Component进行扫描;

6、切面(AOP)相关注解

@Aspect 声明一个切面

7、@Bean的属性支持

@Scope设置类型包括:

设置Spring容器如何新建Bean实例(方法上,得有@Bean)

① Singleton

(单例,一个Spring容器中只有一个bean实例,默认模式),

② Protetype

(每次调用新建一个bean),

③ Request

(web项目中,给每个http request新建一个bean),

④ Session

(web项目中,给每个http session新建一个bean),

8、@Value注解

(1)支持如下方式的注入:

  • 注入普通字符
  • 注入操作系统属性
  • 注入表达式结果
  • 注入其它bean属性
  • 注入文件资源
  • 注入网站资源
  • 注入配置文件

(2)@Value三种情况的用法。

  1. ${}是去找外部配置的参数,将值赋过来
  2. #{}是SpEL表达式,去寻找对应变量的内容
  3. #{}直接写字符串就是将字符串的值注入进去

10、异步相关

@Async

在实际执行的bean方法使用该注解来声明其是一个异步任务(方法上或类上所有的方法都将异步,需要@EnableAsync开启异步任务)

11、定时任务相关

@Scheduled

来申明这是一个任务,包括cron,fixDelay,fixRate等类型(方法上,需先开启计划任务的支持)

12、Enable***注解说明

@EnableWebMvc:开启web MVC的配置支持;
@EnableConfigurationProperties:开启对@ConfigurationProperties注解配置Bean的支持;
@EnableJpaRepositories:开启对SpringData JPA Repository的支持;
@EnableTransactionManagement:开启注解式事务的支持;

Spring Boot的启动流程

1.创建并初始化一个springapplication对象

1.1初始化流程

将传入的配置类赋值给primarysources属性

a.推断web应用类型

b.设置引导初始化器、初始化器、监听器;从spring.factories中获取bootstrapregistryinitializer对象、applicationcontextinitializer对象、applicationlistener对象

c.推断主应用程序类,调用当前线程的调用栈判断main在哪一类

1.2.调用该对象的run方法,启动springboot项目

1.创建并启动一个计时器,记录耗时

2.创建引导启动容器,在spring容器创建之前,缓存对象

3.设置headless属性,设置后jvm不会创建图形资源

4.获取一个运行监听器,发布一个应用开始

5.创建应用参数对象

6.加载环境变量和配置信息,打印环境变量加载成功

7.打印启动界面

8.根据应用类型创建spring容器

9.将环境变量给spring容器,关闭引导启动

10.加载所有自动配置类,创建bean对象和启动webserver

11.spring启动后处理

12.计算耗时,打印已经启动

13.调用applicationrunner和commandlinerunner接口实现的run方法

14.异常处理

HTTP 与 HTTPS 有哪些区别?

HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。

HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。

HTTP 的端口号是 80,HTTPS 的端口号是 443。

HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

网络怎么分层

osi:物理层、链路层、网络层、传输层(tcp\udp)、会话层、表示层、应用层(http\https)

RocketMQ和RabbitMQ的特点

RabbitMQ、Kafka和RocketMQ是三种不同特点的开源消息队列系统,各自适用于不同的场景。

RabbitMQ适用于需要可靠消息传递和灵活消息模型的场景,例如金融系统的支付、订单处理等

RocketMQ适用于高性能、高可用性的消息传递场景,具有丰富的消息过滤和分布式事务特性。例如实时数据分析、电商秒杀等