高途一面

自我介绍

项目介绍

什么是GC

释放那些不再使用的对象所占用的内存。GC首先要判断对象是否一个被收集,常用判断是否被收集的两种方法为

  • 引用计数法:给对象添加引用计数器,每当有引用它的地方,就将计数器+1,当引用失效后,引用计数器-1,当计数器为0时,可以进行回收。
  • 可达性分析法:扫描堆中的对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到则可以进行回收。

垃圾回收器

  • 串行垃圾回收器(serial):也就是单线程回收器,在进行垃圾回收工作的时候,要暂停其他线程,直到它收集结束。新生代采用复制算法,老年代采用标记-整理算法。
    • 缺点是:STP时间太长,用户体验不佳
    • 优点是:简单高效,没有线程之间的开销
  • ParNew回收器(多线程回收器):除了使用多线程进行垃圾回收外,其余的与单线程回收器一样。
  • Parallel Scavenge(吞吐量优先回收器):并行收集器,高效率的利用cpu,吞吐量就是CPU用于运行用户代码的时间与CPU总消耗的时间比值。垃圾回收器并行工作(多条收集线程并行工作,但用户线程仍然处于等待状态)。
  • CMS收集器(响应时间优先):并发收集器(指⽤户线程与垃圾收集线程同时执⾏(但不⼀定是并⾏,可能会交替执⾏),⽤户程序在继续运⾏,⽽垃圾收集器运⾏在另⼀个 CPU 上)以最短回收停顿时间为目标的收集器,注重用户体验,整个过程分为四步骤:
    • 初始标记:暂停其他线程,记录直与root相连的对象,速度很快。
    • 并发标记:GC和用户线程同时执行,由于用户线程会不断的更新引用域,所以GC无法达到可行性分析的实时性,
    • 重新标记:为了修正并发标记期间用户程序运行改变的标记,
    • 并发清除:开启用户线程,同时GC线程开始对未标记的区域做清扫。

使用标记-清楚会产生大量的碎片,但并发标记,低停顿。

  • G1:同时注重吞吐量和低延迟,会将堆划分为多个大小相等的区域。

垃圾回收算法

OSI七层模式

  • 应用层:为计算机用户提供服务
  • 表示层:数据处理(加密,解密,压缩的)
  • 会话层:管理(建立,维护,重连)应用程序之间的会话
  • 传输层:为两台主机之间的通信提供通用的数据传输服务
  • 网络层:路由和寻址,决定数据在网络的游走路径
  • 数据链路层:帧编码和误差纠错
  • 物理层:比特流传输

hashmap底层

数据库的事务性

线程的创建方式

(1)继承Tread类,步骤:

(1)创建一个继承于Thread的子类
(2)重写Thread类的run()方法—-》将此线程执行的操作声明在run()方法中
(3)创建继承于Thread的子类的对象
(4)调用start()方法(该方法作用:①启动当前线程 ②调用当前线程的run()

(2)实现Runnable接口,步骤:

(1)创建实现Runnable接口的类
(2)实现类去实现Runnable中的抽象方法:run()
(3)创建实现类的对象
(4)将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
(5)通过Thread类的对象调用start()

(3)实现Callable接口,步骤:

(1)创建一个实现Callable接口的实现类。

(2)实现call方法,将此线程需要执行的操作声明在call中

(3)创建实现Callable接口的实现类的对象

(4)将该对象传递到FutureTask构造器中,创建FutureTask对象

(5)将FutureTask对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start方法。

(6)如果要获取call方法的返回值时,则使用futureTask.get();则不使用。

(4)线程池的方式创建线程

1
2
3
4
5
6
7
ExecutorService executorService = Executors.newFixedThreadPool(10);
ThreadPoolExecutor service = (ThreadPoolExecutor) executorService;
// 要在ThreadPoolExecutor类中设置,因为ExecutorService是接口,ThreadPoolExecutor是实现类。
// service.setCorePoolSize(15);
executorService.execute(new NumThread2());//适用于实现Runnable
// executorService.submit(Callable callable)//适用于实现Callable
executorService.shutdown(); //关闭连接池

好处:

(1)提高响应速度(减少创建新线程的时间)
(2)降低资源的消耗(重复利用线程池中的线程,不需要每次都创建)
(3)便于线程管理:
corePoolSize:核心池的大小
maximumPoolSize:最大线程数
keepAliveTime:线程没有任务时最多保持多长时间会终止

线程池了解吗

TCP的3次握手和4次挥手

image-20221013162037305

image-20221013162044295

SpringBoot比Spring好在哪里

(1)全部采用注解的方式,没有繁琐的xml配置文件

(2)快速整合第三方框架:

说一下IOC和AOP

项目中用没用到过AOP

项目中哪里用到了事务

操作两张表的时候,保证了事务的一致性,要么全成功,要么全失败,

例如:

(1)添加套餐这个操作,既要添加套餐这个表,也要添加套餐与菜品的关联表,因此要加入@Transactional注解,来保证要么加入两张表都成功,要么加入两张表都失败。

(2)提交订单时,要操作两个表,一个时订单表,和订单明细表,因此要使用事务。

手写二分法


高途一面
http://example.com/2022/10/12/高途一面/
作者
zlw
发布于
2022年10月12日
许可协议