1. JVM包含哪几部分
JVM由三部分组成:类加载子系统、执行引擎、运行时数据区。
- 类加载子系统:可以根据指定的全限定名来载入类或接口。
- 执行引擎:负责执行那些包含在被载入类的方法中的指令。
- 运行时数据区:当程序运行时,JVM需要内存来存储许多内容,例如:字节码、对象、参数、返回值、局部变量、运算的中间结果等,JVM会把这些东西都存储到运行时数据区中,以便于管理。
2. JVM内存模型
- 程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;
- Java 虚拟机栈(Java Virtual Machine Stacks):用于存储局部变量表、操作数栈、动态链接、方法出口等信息;
- 本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;
- Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;
- 方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
3. 双亲委派模型
双亲委派模型是一种层次化的类加载机制,要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。
工作过程:
如果一个类加载器收到了一个类加载的请求,它首先不会去加载类,而是去把这个请求委派给父加载器去加载,直到顶层启动类加载器,如果父类加载不了(不在父类加载的搜索范围内),才会自己去加载。
4. Java内存模型
Java内存分为主内存和工作内存。所有变量都存在主内存中,每个线程都有自己的工作内存(可理解为缓存,实际上底层实现大概就是寄存器或高速缓存),线程的工作内存中将会拷贝主内存中变量的副本,所有的读写等操作都在工作内存中完成,线程的工作内存不能被其他线程访问。
5. Serializable接口为什么需要定义serialVersionUID常量
serialVersionUID常量用于标明当前Serializable类的版本,以验证加载的类和序列化对象是否兼容。
在进行序列化时会将当前类的serialVersionUID写入到字节序列中,在反序列化时会将当前字节流中的serialVersionUID同本地对象中的serialVersionUID进行对比,如果相同则继续序列化,如果不同则失败报错。
serialVersionUID常量值默认为1L。
6. 线程的生命周期
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、死亡。
-
新建:使用new方法,new出来线程。此时,JVM会为线程对象分配内存,并初始化其成员变量的值。此时仅仅是个对象。
-
就绪:当调用线程对象的start()方法后。这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行。此时,JVM会为线程创建调用栈和程序计数器。线程的执行是由底层平台控制
-
运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能。
-
阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态。当发生如下情况时,线程会进入阻塞状态:
- 调用sleep()方法
- 调用wait()方法
- 调用阻塞式IO方法
- 未抢到锁被阻塞
- 等待网络资源
- 其他线程执行join()方法,当前线程则会阻塞
- 被suspend()挂起
- 等待某个通知。
当线程处于阻塞状态时,会通过如下情形解除阻塞,使其重新回到就绪状态:
- 调用的sleep()方法时间到了。
- 网络资源到达
- 调用的阻塞式IO方法已经返回。
- 成功地抢到了锁。
- 其他线程发出了通知
- 调用notify或者notifyAll()方法
- 挂起的线程被resume()方法恢复
-
死亡:线程会以如下三种方式进入死亡状态:
- run方法执行完成,线程正常结束;
- 线程抛出异常;
- 直接调用stop()方法来结束线程——该方法容易导致死锁,通常不建议使用。
7. 什么是MVC
MVC是一种软件设计模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。
- 模型(Model):模型表示应用程序中的数据和业务逻辑。
- 视图(View):视图是用户界面,负责展示模型中的数据。
- 控制器(Controller):控制器是模型和视图之间的桥梁,负责协调模型和视图之间的交互。
MVC模式的优点在于,它将应用程序分为三个独立的部分,使得应用程序的设计更加清晰,易于维护和扩展。提高了应用程序的可重用性和可测试性,使得开发人员可以更加专注于业务逻辑的实现。
8. volatile关键字的理解
volatile关键字是Java虚拟机提供的一种轻量级的同步机制。
volitale保证可见性,不保证原子性,
1、写内存语义:当写一个volatile变量时,JMM会把该线程本地内存中的共享变量的值刷新到主内存中,保证其他线程能读取到的一定是最新值。
2、读内存语义:当读一个volatile变量时,JMM会把该线程本地内存置为无效,使其从主内存中读取共享变量。
JMM是指Java内存模型,而本地内存只是JMM的一个抽象概念,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。
通过内存屏蔽的方式防止重排序,保证了有序性:volatile的底层是采用内存屏障来实现的,在编译器生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。
什么是指令重排优化呢?
编译器和处理器为了优化程序性能而对指令序列进行排序的一种手段,导致实际上指令执行的顺序可能会和源代码中想表达的顺序不一致。
9. 对Spring AOP的理解
AOP:面向切面编程,将代码中重复的部分抽取出来,使用动态代理技术,在不修改源码的基础上对方法进行增强。如果目标对象实现了接口,默认采用JDK动态代理,也可以强制使用CGLib,如果目标对象没有实现接口,采用CGLib的方式。文章来源:https://www.toymoban.com/news/detail-578453.html
10. 布隆过滤器
布隆过滤器用于检索一个元素是否在一个集合中,它由一个很长位数组和N 个哈希函数组成。当一个元素加入布隆过滤器中的时候,使用N个哈希函数分别计算出输入元素的映射位置,并且将每一个位置置为1。判断一个元素是否存在,新增元素使用N个哈希函数分别计算出输入元素的映射位置,判断位数组中的每个元素是否都为 1,如果值都为 1,说明这个值可能在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。文章来源地址https://www.toymoban.com/news/detail-578453.html
到了这里,关于JVM包含哪几部分?JVM内存模型?线程的生命周期? 对Spring AOP的理解?布隆过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!