JVM知识
在学习jvm的时候许多人处于迷茫的状态,对一些基础的知识反而听过就忘了,这篇笔记是我在学习jvm的时候随手记的一些,适合已经学过或者了解过的小伙伴复习回顾一下,当然知识的覆盖是没有的,主要记录了我觉得容易忘记或者记错的知识点,这些有很多是基石知识,希望大家不要忘记,大家看到就当正好复习一下,对大家的面试可能会有一点小小的帮助
内存结构
- 1.方法区用来存储类加载的数据,例如类的名称,方法入口
- 2.JVM虚拟机栈用于存储线程,包括局部变量和方法参数
- 3.堆内存用来存储对象
- 4.方法区的规范实现:永久代和元空间
- 5.方法区 JVM栈 堆 都会发生内存溢出的问题 程序计数器不会
- 6.程序计数器用来存储程序运行到哪里 因为线程是不断切换的
垃圾回收算法
- 标记清除算法:会产生大量内存碎片,很多虚拟机不再使用
- 标记整理算法:适用于老年代的垃圾回收,老年代的无法被回收的对象多,需要被回收的垃圾少,标记整理的效率高
- 标记复制算法:适用于新生代的垃圾回收,无法被回收的对象少,标记复制效率高
- 新生代的垃圾回收:在对新生代进行垃圾回收时,会标记伊甸园区中的被引用的对象将其复制到幸存区的to中,然后将伊甸园的所有对象回收,from和to交换位置,如果一个对象经常被引用,到达一个次数后会晋升老年代
- 新生代老年代差别:新生代可以频繁的回收,速度快 老年代应尽量避免,时间较长
类加载
- 1.类的字节码文件保存在方法区,类名.class即类对象保存在堆内存中
- 2.静态变量属于类,随着类的加载而加载,普通成员变量属于实例对象
- 3.final修饰的变量在加载链接阶段就已经赋值,而在此阶段静态变量只被分配了空间,没有赋值,静态变量的赋值是在初始化阶段完成的
- 4.在类的初始化阶段,静态代码块和静态变量的赋值是在一个方法中完成的
- 5.类的加载和初始化都是懒惰的,非必要不加载,例如访问普通成员变量
Spring框架
Spring_refresh
- 1.Applicationcontext 是beanfactory 衍生来的用于管理bean
- 2.spring容器启动时会创建IOC容器applicationcontext,创建容器时会调用refresh方法,通过这个方法完成bean的创建和初始化
- 3.Environment 主要用于解析@value注解中的${},#{}
- 4.applicationcontext内部仍借用了beanfactory的功能
- 5.Beanfactory 创建和管理bean并不是一瞬间的,需要借助beandefinition,BeanDefinition来源多种多样主要有XML,配置类,组件扫描三种
- 6.通过@configuration注解把一个类声明为配置类,spring会管理配置类,但是beanfactory无法检测到配置类中的@bean注解,这时需要一个后处理器postprocess 帮助beanfinition识别@bean
- 7.通过@component 或者其他注解 将一个类声明为受spring管理的bean spring会通过组件扫描的方式获取这个bean
- 8.Bean的后处理器 用于解析注解例如@Autowired @Resource@Value
- 9.Refresh完成的最后会将beanfinitionmap中的bean放到singletonobjects单例池中,对象创建有三个不同阶段,每个阶段都有不同的bean后处理器参与进来
Spring_bean
1.bean的生命周期 通过refresh方法可以获取singleton中的单例对象,通过getbean方法获取bean 多例对象需要手动getbean
2.依赖注入的优先级@autowired最低 其次是按名称匹配AUTOWIRE_BY_NAME 优先级最高的是精确指定注入bean