JVM包含哪几部分?JVM内存模型?线程的生命周期? 对Spring AOP的理解?布隆过滤器

这篇具有很好参考价值的文章主要介绍了JVM包含哪几部分?JVM内存模型?线程的生命周期? 对Spring AOP的理解?布隆过滤器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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. 双亲委派模型

双亲委派模型是一种层次化的类加载机制,要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。
JVM包含哪几部分?JVM内存模型?线程的生命周期? 对Spring AOP的理解?布隆过滤器,jvm,spring,java
工作过程:
如果一个类加载器收到了一个类加载的请求,它首先不会去加载类,而是去把这个请求委派给父加载器去加载,直到顶层启动类加载器,如果父类加载不了(不在父类加载的搜索范围内),才会自己去加载。
JVM包含哪几部分?JVM内存模型?线程的生命周期? 对Spring AOP的理解?布隆过滤器,jvm,spring,java

4. Java内存模型

Java内存分为主内存和工作内存。所有变量都存在主内存中,每个线程都有自己的工作内存(可理解为缓存,实际上底层实现大概就是寄存器或高速缓存),线程的工作内存中将会拷贝主内存中变量的副本,所有的读写等操作都在工作内存中完成,线程的工作内存不能被其他线程访问。
JVM包含哪几部分?JVM内存模型?线程的生命周期? 对Spring AOP的理解?布隆过滤器,jvm,spring,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()方法来结束线程——该方法容易导致死锁,通常不建议使用。
      JVM包含哪几部分?JVM内存模型?线程的生命周期? 对Spring AOP的理解?布隆过滤器,jvm,spring,java

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的方式。

10. 布隆过滤器

布隆过滤器用于检索一个元素是否在一个集合中,它由一个很长位数组和N 个哈希函数组成。当一个元素加入布隆过滤器中的时候,使用N个哈希函数分别计算出输入元素的映射位置,并且将每一个位置置为1。判断一个元素是否存在,新增元素使用N个哈希函数分别计算出输入元素的映射位置,判断位数组中的每个元素是否都为 1,如果值都为 1,说明这个值可能在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。文章来源地址https://www.toymoban.com/news/detail-578453.html

到了这里,关于JVM包含哪几部分?JVM内存模型?线程的生命周期? 对Spring AOP的理解?布隆过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM-JVM中对象的生命周期

    申明:文章内容是本人学习极客时间课程所写,文字和图片基本来源于课程资料,在某些地方会插入一点自己的理解,未用于商业用途,侵删。 原资料地址:课程资料 对象的创建 常量池检查 :检查new指令是否能在常量池中定位到这个类的符号引用,检查类之前是否被加载过

    2024年02月20日
    浏览(43)
  • JVM 内存分哪几个区,如和判断一个对象是否存活

    JVM 内存分哪几个区,每个区的作用是什么 ? java 虚拟机主要分为以下一个区 : 方法区: 1. 有时候也成为 永久代 ,在该区内很少发生垃圾回收,但是并不代表不发生  GC ,在这里进行的  GC 主要是对方法区里的常量池和对类型的卸载 2. 方法区主要用来存储已被虚拟机加载的类

    2024年02月05日
    浏览(40)
  • JVM系列-3.类的生命周期

    👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家 📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 🍂博主正在努力完成2023计划中:源码

    2024年01月25日
    浏览(36)
  • 线程生命周期、线程通讯

            有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别。    1、yield()方法     yield()让当前正在运行的线程回到就绪,以允许具有相同优先级的其他线程获得运行的机会。但是,实际中无法保证yield()达到让步的目的,因为,让

    2024年02月09日
    浏览(34)
  • [Java]线程生命周期与线程通信

    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18162522 出自【进步*于辰的博客】 线程生命周期与进程有诸多相似,所以我们很容易将两者关联理解并混淆,一些细节之处确有许多不同,因为线程调度与进程调度虽都由

    2024年04月27日
    浏览(35)
  • JVM工作原理与实战(六):类的生命周期-连接阶段

    JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类的生命周期 1.加载(Loading) 2.连接(Linking) 3.初始化(Initialization) 4.使用(Using) 5.卸载(Unloading) 二、连接阶段 1.验证 2.准备 3.解析 总结 JVM作为Java程序的运行环境,其负责解释和执行字

    2024年02月02日
    浏览(38)
  • Java线程生命周期详解

    Java中的线程生命周期是多线程开发的核心概念。了解线程的生命周期以及它们如何进行状态转换对于编写有效且无错误的多线程程序至关重要。 Java线程主要有以下几个状态,这些状态定义在Thread.State枚举类中: 新建状态(New) :当我们创建一个新的线程实例时,线程就处

    2024年02月11日
    浏览(38)
  • JVM——类的生命周期(加载阶段,连接阶段,初始化阶段)

    类的生命周期 ⚫ 1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 程序员可以使用Java代码拓展的不同的渠道。 ⚫ 2、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。 ⚫ 3、类加载器在加载

    2024年02月05日
    浏览(50)
  • 基于Webflux的Websocket的高级和全生命周期完整版讲解,包含代码

    WebSocket是一种在Web应用程序中实现实时双向通信的技术。它允许服务器主动向客户端推送消息,而不需要客户端发起请求。在Spring WebFlux中,我们可以使用 WebSocketHandler 接口来处理WebSocket连接和消息。 在本篇博客中,我们将介绍如何使用 MyWebSocketHandler2 类来构建一个简单的

    2024年02月19日
    浏览(40)
  • 【React】React组件生命周期以及触发顺序(部分与vue做比较)

    最近在学习React,发现其中的生命周期跟Vue有一些共同点,但也有比较明显的区别,并且执行顺序也值得讨论一下,于是总结了一些资料在这里,作为学习记录。 由ReactDOM.render()触发 —— 初次渲染 constructor() —— 类组件中的构造函数 static getDerivedStateFromProps(props, state) 从pr

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包