JVM面试和学习中需要注意的部分

2023-07-29,,

内存结构

1.方法区用来存储类加载的数据,例如类的名称,方法入口
2.JVM虚拟机栈用于存储线程,包括局部变量和方法参数
3.堆内存用来存储对象
4.方法区的规范实现:永久代和元空间
5.方法区 JVM栈 堆 都会发生内存溢出的问题 程序计数器不会
6.程序计数器用来存储程序运行到哪里 因为线程是不断切换的


垃圾回收算法

标记清除算法:会产生大量内存碎片,很多虚拟机不再使用
标记整理算法:适用于老年代的垃圾回收,老年代的无法被回收的对象多,需要被回收的垃圾少,标记整理的效率高
标记复制算法:适用于新生代的垃圾回收,无法被回收的对象少,标记复制效率高
新生代的垃圾回收:在对新生代进行垃圾回收时,会标记伊甸园区中的被引用的对象将其复制到幸存区的to中,然后将伊甸园的所有对象回收,from和to交换位置,如果一个对象经常被引用,到达一个次数后会晋升老年代
新生代老年代差别:新生代可以频繁的回收,速度快 老年代应尽量避免,时间较长


类加载

1.类的字节码文件保存在方法区,类名.class即类对象保存在堆内存中
2.静态变量属于类,随着类的加载而加载,普通成员变量属于实例对象
3.final修饰的变量在加载链接阶段就已经赋值,而在此阶段静态变量只被分配了空间,没有赋值,静态变量的赋值是在初始化阶段完成的
4.在类的初始化阶段,静态代码块和静态变量的赋值是在一个方法中完成的
5.类的加载和初始化都是懒惰的,非必要不加载,例如访问普通成员变量


Spring框架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

JVM面试学习需要注意的部分的相关教程结束。

《JVM面试和学习中需要注意的部分.doc》

下载本文的Word格式文档,以方便收藏与打印。