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

news2024/10/6 12:31:31

目录

    • 1. JVM包含哪几部分
    • 2. JVM内存模型
    • 3. 双亲委派模型
    • 4. Java内存模型
    • 5. Serializable接口为什么需要定义serialVersionUID常量
    • 6. 线程的生命周期
    • 7. 什么是MVC
    • 8. volatile关键字的理解
    • 9. 对Spring AOP的理解
    • 10. 布隆过滤器

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

双亲委派模型是一种层次化的类加载机制,要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。
在这里插入图片描述
工作过程:
如果一个类加载器收到了一个类加载的请求,它首先不会去加载类,而是去把这个请求委派给父加载器去加载,直到顶层启动类加载器,如果父类加载不了(不在父类加载的搜索范围内),才会自己去加载。
img

4. Java内存模型

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()方法来结束线程——该方法容易导致死锁,通常不建议使用。
      img

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,说明该元素不在布隆过滤器中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WalkRE2019--构面流程

1、手动圈图 选中面层中的一般房屋面,双击,鼠标变成十字光标后,开始在图上圈出一个闭合形状。如下: 如上,完成一个一般房屋面的绘制。 2、加工菜单栏中的自动构面功能。 这里推荐点击构面方法,原因是操作起…

MachineLearningWu_13_AGI

AGI的全称是artificial general intelligence,通用人工智能,而我们现在做的关于医学影像的分析,可以说完全是ANI。 而我们使用MLP对于大脑中神经网络的模拟更是完全不同于人类大脑的行为。

mysql(三)InnoDB之自适应hash索引

目录 前言自适应哈希索引 (Adaptive Hash Index, AHI)既然是哈希,key 是什么,value 是什么?为啥叫 “自适应 (adaptive)****” 哈希索引?系统会不会判断失误,是不是一定能加速? 创建自定义的hash索引思路示…

华为申请注册盘古大模型商标;京东推出言犀大模型,率先布局产业应用

7月14日科技新闻早知道,一分钟速览。 1.华为申请注册盘古大模型商标: 据天眼查 App 显示,7 月 7 日,华为技术有限公司申请注册“华为云盘古”、“Huawei Cloud Pangu Models”文字及图形商标,国际分类为网站服务、社…

基础设施SIG月度动态:龙蜥官网新增CSDN第三方账号登录,内核CI新增测试任务停止功能

基础设施 SIG(OpenAnolis Infra SIG)目标:负责 OpenAnolis 社区基础设施工程平台的建设,包括官网、Bugzilla、Maillist、ABS、ANAS、CI 门禁以及社区 DevOps 相关的研发工程系统。 01 SIG 整体进展 1. 龙蜥社区官网与 CSDN dev…

管理大规模文件的挑战与解决方案

管理大规模文件是当今企业和组织面临的一项重要挑战。随着信息技术的迅速发展和数字化转型的推进,组织内外产生的文件数量呈指数级增长,如何高效地管理这些文件成为了亟待使用文件管理系统解决的问题。 挑战一:数据量巨大 随着企业和组织的…

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(5)----驱动多个VL6180X

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X----5.驱动多个VL6180X 概述样品申请修改设备地址配置vl6180x主程序测试结果 概述 在本章中,我们将探讨如何同时驱动多个VL6180传感器进行距离测量。我们将介绍如何有效地管理多个传感器之间的通信和控制,以确…

❤️创意网页:创造精彩的登录体验-3D翻转登录页面

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

(9)基础强化:元字符,正则表达式,匹配,提取组,Regex,Match与Matches

一、作业 1、问:下面解压程序出错,什么原因? string src "E:\1.txt";string des "E:\2.txt";using (FileStream read File.OpenRead(src)){using (GZipStream gzip new GZipStream(read, CompressionMode.Decompress…

FPGA——按键控制led灯

文章目录 一、实验环境二、实验任务三、系统设计四、实验过程4.1 编写verilog代码4.2 引脚配置 五、仿真5.1 仿真代码5.2 仿真结果 六、实验结果七、总结 一、实验环境 quartus 18.1 modelsim vscode Cyclone IV开发板 二、实验任务 使用开发板上的四个按键控制四个LED灯。按…

“反AI斗士”马斯克进军AI,你怎么看?

“反AI斗士”马斯克进军AI,你怎么看? 当地时间7月12日,马斯克在Twitter上宣布:“xAI正式成立,去了解现实。”马斯克表示,推出xAI的原因是想要“了解宇宙的真实本质”。公司由马斯克本人亲自带队&#xff0c…

软件外包开发的原型图工具

在软件开发中需要用到原型图工具来将需求转化为图形界面,这样可以更好更准确的表达需求的实现方式。与传统的需求文档相比,原型图的表达更直接,不但可以画出UI,也支持UI之间的跳转连接,与最终的实现效果基本是一样的。…

【雕爷学编程】Arduino动手做(149)---MAX9814咪头传感器模块4

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

如何在Windows 8和10中检查最后一次的启动模式

Windows 8、Windows 8.1 和 Windows 10 中的用户可以在 PC 上执行混合关机(快速启动)、完全关机或休眠。 快速启动(又名:hiberboot、混合启动或混合关机)在 Windows 中默认打开,是一种帮助你的电脑在关机后更快启动的设置。甚至比休眠还要快。 休眠是一种主要为笔记本电…

Linux下Nginx升级

nginx版本升级不会覆盖配置文件,但以防万一升级前请先备份配置文件或者配置文件夹 默认配置文件地址:/usr/local/nginx/conf/nginx.conf 1.下载 wget -c http://nginx.org/download/nginx-1.24.0.tar.gz 2.解压 tar -xvf nginx-1.24.0.tar.gz 3.nginx…

【图像处理】使用 Python 进行图像增强

一、说明 图像增强技术的深度和复杂性往往在一系列捕获和共享中被忽视。从傅里叶变换到白平衡和直方图处理,各种方法都可以将普通照片转换为引人注目的图像。这篇博文旨在解开这些技术。 我在节日期间拍了一张照片,在夜间庆祝活动中。遗憾的是&#xff0…

OpenCV中掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

文章目录 1、掩膜(Mask)是什么(1)从物理的角度来看:(2)图像处理中的掩膜Mask(3)掩膜的用法:(4)掩膜Mask 的运算: 2、setTo()函数:将图…

【动手学习深度学习--逐行代码解析合集】17使用块的网络(VGG)

【动手学习深度学习】逐行代码解析合集 17使用块的网络(VGG) 视频链接:动手学习深度学习–使用块的网络(VGG) 课程主页:https://courses.d2l.ai/zh-v2/ 教材:https://zh-v2.d2l.ai/ 1、VGG网络…

【UniApp开发小程序】顶部导航栏和底部导航栏设置+iconfont图标引入

文章目录 顶部导航栏和底部导航栏设置创建几个需要底部导航栏切换的页面使用阿里巴巴矢量图标库完成底部导航栏tabBar设置页面顶部导航栏标题 样式优化 顶部导航栏和底部导航栏设置 在正式开发小程序的功能之前,首先需要确定小程序的主要框架。 创建几个需要底部导…

组件的创建,引用,样式隔离以及methods,data,properties和数据事件监听

组件的创建,引用,样式隔离以及methods,data,properties和数据事件监听 1. 组件的创建2. 组件的引用2.1. 局部引用2.2. 全局引用2.3. 组件和页面的区别 3. 组件的样式隔离3.1. 默认情况,组件样式隔离性3.2. 修改组件的样式隔离选项 4. 组件的d…