【高频面试题】JVM篇

文章目录

  • 一、JVM组成
    • 1.什么是程序计数器
    • 2.什么是Java堆?
    • 3.能不能介绍一下方法区(元空间)
    • 4.你听过直接内存吗
    • 5.什么是虚拟机栈
    • 6.垃圾回收是否涉及栈内存?
    • 7.栈内存分配越大越好吗?
    • 8.方法内的局部变量是否线程安全?
    • 9.什么情况下会导致栈内存溢出?
    • 10.堆栈的区别是什么
  • 二、类加载器
    • 11.什么是类加载器,类加载器有哪些
    • 12.什么是双亲委派模型?
    • 13.JVM为什么采用双亲委派机制?
    • 14.说一下类装载的执行过程
  • 三、垃圾回收
    • 15.强引用、软引用、弱引用、虚对象什么时候可以被垃圾器回收
      • 15.1 对象什么时候可以被垃圾器回收
    • 16.JVM 垃圾回收算法有哪些?
      • 16.1 标记清除算法
      • 16.2 标记整理算法( 标记清除算法的升级---多了一个整理阶段)
      • 16.3 复制算法
    • 17.说一下JVM中的分代回收
      • 17.1 MinorGC、 Mixed GC 、 FullGC的区别是什么
    • 18.说一下JVM有哪些垃圾回收器?
    • 19.详细聊一下G1垃圾回收器
  • 四、JVM实践
    • 20.JVM 调优的参数可以在哪里设置
    • 21.用的 JVM 调优的参数都有哪些?
    • 22.说一下 JVM 调优的工具?
    • 23.Java内存泄露的排查思路?
    • 24.CPU飙高排查方案与思路?

JVM是什么:
JVM(Java虚拟机)是Java程序的 运行环境,它是Java平台的核心组成部分之一。JVM提供了一个 运行Java字节码的虚拟机,负责将 Java程序解释和执行。

Java程序员可以在JVM上编写和运行Java程序,而不用考虑底层操作系统的差异性。JVM的特性使得Java具备了跨平台性,同一份Java代码可以在不同的操作系统上运行
在这里插入图片描述
组成部分如下:
在这里插入图片描述

一、JVM组成

1.什么是程序计数器

程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。(通俗的来说就是记录当前线程的程序执行的字节码指令的行号)

在这里插入图片描述


2.什么是Java堆?

线程共享的区域:主要用来保存对象实例数组等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。

Java1.8-JVM内存结构

在这里插入图片描述
其中:堆分为两部分
年轻代
包括三部分,Eden区和两个大小严格相同的Survivor区,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到老年代区间。

老年代
主要保存生命周期长的对象,一般是一些老的对象

元空间
保存的类信息静态变量常量编译后的代码

Java1.7-JVM内存结构

唯一的不同就是在java8的JVM中,元空间是在本地内存中的,而java7当中元空间是作为方法区/永久代存在于堆空间中的

在这里插入图片描述
因而在1.8之后做出改动,主要是为了防止OMM内存泄漏,因为元空间(方法区/永久代)保存的是类信息静态变量常量编译后的代码,随着程序不断庞大,实现很难预估元空间的大小,久而久之就会产生OMM。

在旧的Java版本(如Java 7及更早版本)中,方法区和永久代(PermGen)都是的一部分,用于存储类的结构信息、常量池、静态变量等。但永久代容易导致内存溢出的问题,因为它的大小是固定的,并且无法在运行时动态调整。
为了解决这个问题,并改进类的元数据的存储方式,Java 8 引入了元空间(Metaspace)。元空间通过使用本地内存来存储类的元数据,有效地解决了永久代的限制和内存溢出问题。与永久代不同,元空间的大小并不受堆内存大小的限制,而是受系统的物理内存限制

元空间还具有自动调整大小的能力,可以根据需要动态地分配和释放内存。这使得元空间更具灵活性和可靠性,并能更好地适应各种应用程序的需求。


3.能不能介绍一下方法区(元空间)

在不同的JVM实现中,方法区存在位置是不一样的。
这里举例在jdk1.7时的jvm
在这里插入图片描述

方法区(Method Area)是各个线程共享的内存区域
主要存储类的信息运行时常量池
虚拟机启动的时候创建关闭虚拟机时释放
如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError: Metaspace
在这里插入图片描述
普通常量池
可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息

通俗的说,就是记录了虚拟机指令和执行的类名、方法名等信息的映射关系

编译阶段:常量池的符号引用为这种#+数字,因为只是编译阶段,没到运行阶段,只需要直到机器指令和方法、类名等等的映射关系,能找到对应上就算编译通过

在这里插入图片描述
运行时常量池
在类加载阶段,JVM会将符号引用解析为直接引用(将符号替换为真实的地址值),并将其存储在常量池中,以供运行时使用。

*常量池是 .class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

在这里插入图片描述


4.你听过直接内存吗

直接内存:并不属于JVM中的内存结构不由JVM进行管理。是虚拟机的系统内存,常见于NIO(非阻塞io)操作时,用于数据缓冲区,它分配回收成本较高,但读写性能高

直接内存最直接的体现就是常规IO和NIO的区别:
我们都知道NIO是非阻塞的,IO是传统阻塞式

IO传统阻塞式

在这里插入图片描述

相当于java程序不能直接去读系统内存给的数据,需要一个媒介就是堆内存java缓冲区

NIO非阻塞式
在这里插入图片描述

相比较IO是直接到直接内存读数据,所以只要将磁盘文件读到直接内存,数据准备就绪,程序切换到内核态就直接从直接内存读数据


5.什么是虚拟机栈

通俗来说就是线程的方法栈

Java Virtual machine Stacks (java 虚拟机栈)

每个线程运行时所需要的内存,称为虚拟机栈,先进后出

每个栈由多个栈帧(frame)组成(一个栈帧代表一个方法占用的内存),对应着每次方法调用时所占用的内存

每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

也就是一个方法(主方法)可以调用其他很多别的方法(子方法)

在这里插入图片描述


6.垃圾回收是否涉及栈内存?

垃圾回收主要指就是堆内存,当栈帧弹栈以后,内存就会释放


7.栈内存分配越大越好吗?

未必,默认的栈内存通常为1024k
栈帧过大会导致线程数变少,例如,机器总内存为512m,目前能活动的线程数则为512个,如果把栈内存改为2048k,那么能活动的栈帧就会减半

很好理解,机器内存就那么多,单独把栈内存调大了,那么栈帧的个数自然的得变少,所以对应的线程数就会变少


8.方法内的局部变量是否线程安全?

如果方法内局部变量没有逃离方法的作用范围,它是线程安全
如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

通俗来说,就是看方法内的局部变量是不是完全包围在方法内(像如果是作为方法参数传过来的、作为返回值返回的都可以算是逃离了方法的作用范围),这样别的线程可以肆意修改方法内的局部变量

在这里插入图片描述


9.什么情况下会导致栈内存溢出?

栈帧过多导致栈内存溢出,典型问题:递归调用
在这里插入图片描述

栈帧过大导致栈内存溢出(基本上不存在)

栈的容量较小:相对于堆内存而言,栈内存的容量通常比较有限。每个线程都有自己的栈空间,而每个栈的大小通常只有几MB到几十MB。这限制了栈帧的大小,使得栈溢出的概率较低。


10.堆栈的区别是什么

分配对象和数据类型:堆内存用于分配Java对象数组。所有通过关键字new创建的对象以及通过反射或JNI创建的对象都存储在堆中。而栈内存主要用于存储基本数据类型的变量方法调用时的局部变量。

存储位置:堆内存位于JVM的堆区,是一个共享的内存区域。栈内存位于JVM的栈区每个线程都有自己的独立栈

内存管理方式内存的分配和回收由Java虚拟机的垃圾回收器负责管理。垃圾回收器会自动回收不再使用的对象,并释放对应的内存空间。而内存的分配和回收是由编译器自动管理的,当方法执行结束或变量超出作用域时,栈上的内存会自动被释放

内存分配速度内存的分配速度相对较慢,因为需要进行复杂的垃圾回收算法和对象定位操作。而内存的分配速度较快,仅仅是简单地进行指针移动。

内存空间大小限制堆内存的大小一般比栈内存大得多。堆内存的大小可以通过JVM的配置参数进行调整。而内存的大小是由线程的启动参数决定的,每个线程的栈大小通常是固定的。

对象的生命周期堆内存中的对象生命周期可以很长,可以在程序的任意位置被引用和访问。而内存中的局部变量生命周期与方法调用密切相关,当方法执行结束时,栈上的局部变量会自动销毁。

总结来说,堆内存主要用于存储Java对象和数组,由垃圾回收器管理,分配和回收速度相对较慢;而栈内存主要用于存储基本数据类型的变量和方法调用时的局部变量,由编译器自动管理,分配和回收速度相对较快。两者在内存管理方式、存储位置、分配速度和大小等方面有较大的区别。


二、类加载器

11.什么是类加载器,类加载器有哪些

类加载器
JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。
在这里插入图片描述
类加载器包括四种

启动类加载器(加载像库里自带的类string integer等等(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库
扩展类加载器(ExtClassLoader):主要加载JAVA_HOME/jre/lib/ext目录中的类
应用类加载器(加载自己java程序写的类(AppClassLoader):用于加载classPath下的类
自定义类加载器(很少自己写加载器(CustomizeClassLoader):自定义类继承ClassLoader,实现自定义类加载规则。
在这里插入图片描述


12.什么是双亲委派模型?

加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载子加载器尝试加载该类
举例:

假设有一个Student类,需要加载
这个时候就会定位到AppclassLoader(应用类加载器),发现应用记载器有上级加载器,就先不加载,看看上级加载器里面有没有加载过的Student类,一直往上找,发现都没有加载过的Student类,那么此时AppclassLoader才会去加载Student类

在这里插入图片描述
假设有一个String类,需要加载,也是定位到AppclassLoader(应用类加载器)往上委托直到找到启动类加载器,找到了加载好的String类,直接加载。
在这里插入图片描述


13.JVM为什么采用双亲委派机制?

JVM采用双亲委派机制(Parent Delegation Model)是为了解决两个主要问题:
安全性避免类的重复加载

安全性体现在:
确保核心Java库的安全性,避免恶意代码通过自定义的类伪装成核心类库,从而提高系统的安全性。

例如下面我们自己创建一个String包装类,此时核心类库是本身就会加载这个类,这个时候就会报错,不允许加载自定义的核心库的类。

双亲委派机制可以确保核心Java库的安全性。当一个类需要被加载时,首先会委派给父类加载器进行查找和加载只有在父类加载器无法找到该类时才会由当前类加载器自己去加载。

在这里插入图片描述
在这里插入图片描述

避免类的重复加载体现在
通过双亲委派机制,当一个类需要被加载时,首先由父类加载器尝试加载,如果父类加载器已经加载了该类,就直接返回;否则,再由子类加载器尝试加载。这种机制可以确保在整个类加载器层次结构中每个类只被加载一次避免了类的重复加载,提高了运行效率


14.说一下类装载的执行过程

类在装载的时候会经历7个过程:

在这里插入图片描述

  • 加载:查找和导入class文件
  • 验证:保证加载类的准确性
  • 准备:为类变量分配内存并设置类变量初始值
  • 解析:把类中的符号引用转换为直接引用
  • 初始化:对类的静态变量,静态代码块执行初始化操作
  • 使用:JVM 开始从入口方法开始执行用户的程序代码
  • 卸载:当用户程序代码执行完毕后,JVM便开始销毁创建的Class对象。

详细参考链接:【JVM】类装载的执行过程


三、垃圾回收

15.强引用、软引用、弱引用、虚对象什么时候可以被垃圾器回收

15.1 对象什么时候可以被垃圾器回收

垃圾回收,回收的是针对于堆的
在这里插入图片描述

简单一句就是:如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。

如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法

引用计数法(不常用)

一个对象被引用了一次,在当前的对象头上递增一次引用次数(ref=1),如果这个对象的引用次数为0(ref=0),代表这个对象可回收
在这里插入图片描述
但是当对象间出现了循环引用的话,则引用计数法就会失效
在这里插入图片描述

可达性分析算法
现在的虚拟机采用的都是通过可达性分析算法来确定哪些内容是垃圾。

比如下面的例子
X,Y这两个节点是可回收的
Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
扫描堆中的对象,看是否能够沿着 GC Root 对象 为起点的引用链找到该对象,找不到,表示可以回收
在这里插入图片描述
哪些对象可以作为 GC Root ?

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
    在这里插入图片描述

  • 方法区中类静态属性引用的对象
    在这里插入图片描述

  • 方法区中常量引用的对象
    在这里插入图片描述

  • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象


16.JVM 垃圾回收算法有哪些?

参考链接:GC详解、GC四大算法和GC Root

总共分为三种:
标记清除算法:垃圾回收分为2个阶段,分别是标记和清除,效率高,有磁盘碎片,内存不连续

标记整理算法:标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无碎片,对象需要移动,效率低

复制算法:将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收;无碎片,内存使用率低

16.1 标记清除算法

标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除
1.根据可达性分析算法得出的垃圾进行标记
2.对这些标记为可回收的内容进行垃圾回收

注意:标记GC Root引用链的对象,回收的就是没有被标记的
在这里插入图片描述

缺点:

  • 需要两次扫描,耗时严重。

先扫描一次,对存活的对象进行标记。
再次扫描,回收没有被标记的对象。

  • 会产生内存碎片,导致内存空间不连续。

当需要分配一个较大的内存块时,由于没有足够的连续内存空间,可能会导致分配失败即内存溢出。

16.2 标记整理算法( 标记清除算法的升级—多了一个整理阶段)

优缺点同标记清除算法,解决了标记清除算法的碎片化的问题,同时,标记压缩算法多了一步,对象移动内存位置的步骤,其效率也有有一定的影响。

相比较标记清除算法在垃圾回收后,会将活着的对象滑动到一侧,这样就能让空出的内存空间是连续的。
在这里插入图片描述

16.3 复制算法

相当于把一块堆内存分成两半来用,一般拿来存对象,另一半拿来做垃圾回收后的整理收纳仓(必须为空闲空间)

复制算法需要将存活的对象一个区域复制到另一个区域(空白区域),然后直接清空存活对象和待回收对象的那一片区域

注意:要求堆内存的使用比例不超过50%,因为每次垃圾回收时,需要保证目标区域有足够的空间来存放从源区域复制过来的对象。

在这里插入图片描述
优点:
在垃圾对象多的情况下,效率较高
清理后,内存无碎片

缺点:
分配的2块内存空间,在同一个时刻,只能使用一半,内存使用率较低


17.说一下JVM中的分代回收

一、堆的区域划分
堆被分为了两份:新生代和老年代【1:2】
对于新生代,内部又被分为了三个区域。Eden区幸存者区survivor(分成from和to)【8:1:1】

二、对象回收分代回收策略

  • 新创建的对象,都会先分配到eden区
  • 当伊甸园内存不足,标记伊甸园与 from(现阶段没有)的存活对象
  • 将存活对象采用复制算法复制到to中,复制完毕后,伊甸园和 from 内存都得到释放
  • 经过一段时间后伊甸园的内存又出现不足,标记eden区域to区存活的对象,将其复制到from区
  • 当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会提前晋升)

参考链接:【JVM】JVM中的分代回收

17.1 MinorGC、 Mixed GC 、 FullGC的区别是什么

STW(Stop-The-World):暂停所有应用程序线程,等待垃圾回收的完成

MinorGC、 Mixed GC 、 FullGC 相当于垃圾回收的等级:
在这里插入图片描述

MinorGC:【young GC】发生在新生代的垃圾回收,暂停时间短(STW)
Mixed GC新生代 + 老年代部分区域的垃圾回收,G1 收集器特有
FullGC新生代 + 老年代完整垃圾回收,暂停时间长(STW),应尽力避免


18.说一下JVM有哪些垃圾回收器?

在jvm中,实现了多种垃圾收集器,包括:

  1. 串行垃圾收集器
    Serial 作用于新生代,采用复制算法
    Serial Old 作用于老年代,采用标记-整理算法

  2. 并行垃圾收集器(JDK8默认使用此垃圾回收器
    Parallel New作用于新生代,采用复制算法
    Parallel Old作用于老年代,采用标记-整理算法

  3. CMS(并发)垃圾收集器
    针对老年代垃圾回收的

  4. G1垃圾收集器(在JDK9之后默认使用
    应用于新生代和老年代

详细参考链接:


19.详细聊一下G1垃圾回收器


四、JVM实践

20.JVM 调优的参数可以在哪里设置


21.用的 JVM 调优的参数都有哪些?


22.说一下 JVM 调优的工具?


23.Java内存泄露的排查思路?


24.CPU飙高排查方案与思路?

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VSCode】报错:出现段错误解决办法 (Segmentation fault)

VScode报错:Segmentation fault (core dumped)的解决办法 解决Program received signal SIGSEGV, Segmentation fault.的辛酸 Linux环境下段错误的产生原因及调试方法小结 Linux下的段错误Segmentationfault产生的原因及调试方法经典.pdf 在程序中,TF…

【云原生】Kubernetes节点亲和性分配 Pod

目录 1 给节点添加标签 2 根据选择节点标签指派 pod 到指定节点[nodeSelector] 3 根据节点名称指派 pod 到指定节点[nodeName] 4 根据 亲和性和反亲和性 指派 pod 到指定节点 5 节点亲和性权重 6 pod 间亲和性和反亲和性及权重 7 污点和容忍度 8 Pod 拓扑分布约束 官方…

Django快速入门

文章目录 一、安装1.创建虚拟环境(virtualenv和virtualenvwrapper)2. 安装django 二、改解释器三、创建一个Django项目四、项目目录项目同名文件夹/settings.py 五、测试服务器启动六、数据迁移七、创建应用八、基本视图1. 返回响应 response2. 渲染模板…

jpa查询返回自定义对象、返回指定VO、POJO

jpa查询返回自定义对象、返回指定VO、POJO jpa查询返回自定义对象、返回指定VO、POJO,JPA查询前会做大量处理,还有线程通知的操作。若并发大,处理性能直线下降。但是jpa就因为做了大量处理,对多数据库兼容极好,操作方…

MySQL的第一篇文章——了解数据库、简单的SQL语句

目录 学习目标 第一章 介绍数据库 1. 数据库概述 2. MySQL概述 第二章 MySQL的使用 1. MySQL服务的启动 2. 客户端连接MySQL 2.1 命令行客户端 第三章 SQL的介绍 1. 什么是SQL 2. SQL的分类 3. MySQL的语法规范和要求 第四章 DDL操作数据库 1. 创建数据库 2. 查…

word横向页面侧面页码设置及转pdf后横线变竖线的解决方案

在处理材料的时候,会遇到同一个文档里自某一页开始,页面布局是横向的,这时候页码要设置在侧面,方法是双击页脚,然后在word工具栏上选择“插入”——>“文本框”——>“绘制竖版文本框”,然后在页面左…

【MFC】10.MFC六大机制:RTTI(运行时类型识别),动态创建机制,窗口切分,子类化-笔记

运行时类信息&#xff08;RTTI&#xff09; C: ##是拼接 #是替换成字符串 // RTTI.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <afxwin.h>#ifdef _DEBUG #define new DEBUG_NEW #endifCWinApp th…

面试笔记:Android 架构岗,一次4小时4面的体验

作者&#xff1a;橘子树 此次面试一共4面4小时&#xff0c;中间只有几分钟间隔。对持续的面试状态考验还是蛮大的。 关于面试的心态&#xff0c;保持悲观的乐观主义心态比较好。面前做面试准备时保持悲观&#xff0c;尽可能的做足准备。面后积极做复盘&#xff0c;乐观的接受最…

明月之刃:armbian巧借nmtui管理网络连接

文章目录 nmtui简介安装nmtuinmtui使用连接wifi设置主机名称 nmtui简介 nmtui是NetworkManager TUI&#xff08;Text User Interface&#xff09;的缩写&#xff0c;它提供了一个可视化的界面来管理网络连接。但是&#xff0c;在Debian系统中&#xff0c;没有默认安装nmtui工具…

Web 服务器 -【Tomcat】的简单学习

Tomcat1 简介1.1 什么是Web服务器 2 基本使用2.1 下载2.2 安装2.3 卸载2.4 启动2.5 关闭2.6 配置2.7 部署 3 Maven创建Web项目3.1 Web项目结构3.2 创建Maven Web项目 4 IDEA使用Tomcat4.1 集成本地Tomcat4.2 Tomcat Maven插件 Tomcat 1 简介 1.1 什么是Web服务器 Web服务器是…

详解JAVA远程debug

目录 1.什么是远程debug&#xff1f; 2.远程debug普通JAVA程序 环境 测试程序 程序启动指令 编译器配置 3.远程debug JAVA Web程序 4.远程debug spring boot程序 1.什么是远程debug&#xff1f; 远程debug&#xff0c;也就是可以在本地debug远端部署的程序&#xff0c…

【数据结构与算法】十大经典排序算法-冒泡排序

&#x1f31f;个人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知识导航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f334;掘金&#xff1a;HelloCode &#x1f31e;知乎&#xff1a;HelloCode ⚡如有问题&#xff0c;欢迎指正&#…

MOCK测试

介绍 mock&#xff1a;就是对于一些难以构造的对象&#xff0c;使用虚拟的技术来实现测试的过程。 mock测试&#xff1a;在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;可以用一个虚拟的对象来代替的测试方 法。 接口Mock测试&#xff1a;在接口…

【C++】内存管理与模板

目录 一、内存管理 1.new与delete基本用法 (1) 内置类型 (2) 自定义类型 2.new, delete与malloc, free对比 (1) 内置类型 (2) 自定义类型 (3)综合特点 3.new与delete的底层实现 4. 定位new表达式 二、模板 1.引入机制 2. 基本使用 (1) 函数模板 ①概念&#xff1a…

Hadoop+Python+Django+Mysql热门旅游景点数据分析系统的设计与实现(包含设计报告)

系统阐述的是使用热门旅游景点数据分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体…

06-1_Qt 5.9 C++开发指南_对话框与多窗体设计_标准对话框

在一个完整的应用程序设计中&#xff0c;不可避免地会涉及多个窗体、对话框的设计和调用&#xff0c;如何设计和调用这些对话框和窗体是搞清楚一个庞大的应用程序设计的基础。本章将介绍对话框和多窗体设计、调用方式、数据传递等问题&#xff0c;主要包括以下几点。 Qt 提供的…

OffSec Labs Proving grounds Play——FunboxEasyEnum

文章目录 端口扫描目录扫描文件上传漏洞利用查看用户爆破密码sudo提权flag位置FunboxEasyEnum writeup walkthrough Funbox: EasyEnum ~ VulnHub Enumeration Brute-force the web server’s files and directories. Be sure to check for common file extensions. Remote…

Hadoop理论及实践-HDFS四大组件关系(参考Hadoop官网)

NameNode&#xff08;名称节点&#xff0c;Master主节点&#xff09; NameNode主要功能 1、NameNode负责管理HDFS文件系统的元数据&#xff0c;包括文件&#xff0c;目录&#xff0c;块信息等。它将元数据Fsimage与Edit_log持久化到硬盘上。一个是Fsimage(镜像文件&#xff09…

android,Compose,消息列表和动画(点击item的时候,就会删除)

Compose,消息列表和动画&#xff08;点击item的时候&#xff0c;就会删除&#xff09; package com.example.mycompose08import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundat…

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

PoseiSwap 曾在前不久分别以 IDO、IEO 的方式推出了 POSE 通证&#xff0c;但 PoseiSwap DEX 中并未向除 Zepoch 节点外的角色开放 POSE 资产的交易。而在前不久&#xff0c;PoseiSwap 推出了全新的“Poseidon”池&#xff0c;该池将向所有用户开放&#xff0c;并允许用户自由的…