JVM相关面试题

文章目录

  • 什么是 JVM?
  • Java语言的执行原理?
  • Java的字节码文件结构?
    • 什么是u2,u4?
  • JVM 加载过程都是什么步骤?
  • 什么是类加载器?
  • 什么是双亲委派模型
  • 如何打破双亲委派机制?
  • 什么是 tomcat 类加载机制?
  • 什么是JVM内存模型?
    • JVM 按照线程是否共享将内存分为两大类
  • 什么是JVM执行引擎
  • 什么是解释器与即时编译器
  • 简述Java的对象结构
  • 为什么要进行垃圾回收?
  • 为什么要进行堆内存分区:
  • 简述一下JVM堆内存的划分
  • 什么是YoungGC和OldGC
    • YoungGC
    • OldGC
  • Survivor区空间并不大,如果满了怎么办?
  • 为什么需要Survivor区?
  • 为什么需要两块Survivor区?
  • 如何判断一个对象是垃圾
  • 你知道哪些垃圾收集算法?
  • 什么是垃圾收集器?如何判断一个垃圾收集器的好坏呢?
  • 说一下 JVM 有哪些垃圾收集器?
    • CMS收集器
    • G1 收集器
    • ZGC 收集器
  • 如何选择垃圾收集器?
  • 如何设置JVM的参数?
  • JVM常用命令

什么是 JVM?

JVM 是Java Virtual Machine (Java虚拟机) 的缩写,是一个可以执行Java字节码的虚拟机进程 。是Java实现跨平台的最核心的部分

Java语言的执行原理?

先编译,后解释执行
Java源文件 --> 编译器 --> class文件(虚拟指令)–> Java虚拟机(JVM)–> 解释为指令执行

Java的字节码文件结构?

ClassFile {u4             magic;                        // 魔数,标识类文件的类型。Java类文件固定为0xCAFEBABE。u2             minor_version;                // 次版本号,指示Java编译器的版本。u2             major_version;                // 主版本号,指示Java编译器的版本。u2             constant_pool_count;          // 常量池计数,存储着类文件中使用的字符串、类、字段、方法等常量信息。cp_info        constant_pool[constant_pool_count-1]; // 常量池数组,存储着类文件中使用的字符串、类、字段、方法等常量信息。u2             access_flags;                 // 访问标志,描述类或接口的访问级别和属性。u2             this_class;                   // 当前类的索引,指示该类在常量池中的位置。u2             super_class;                  // 父类的索引,指示该类直接父类在常量池中的位置。u2             interfaces_count;             // 接口数量,列出该类实现的接口。接口也在常量池中表示。u2             interfaces[interfaces_count];// 接口数组,列出该类实现的接口。接口也在常量池中表示。u2             fields_count;                 // 字段数量,描述类包含的字段。field_info     fields[fields_count];         // 字段数组,描述类包含的字段。u2             methods_count;                // 方法数量,描述类中定义的方法。method_info    methods[methods_count];       // 方法数组,描述类中定义的方法。u2             attributes_count;             // 属性数量,用于存储类、字段和方法的附加信息,如注解、源码行号等。attribute_info attributes[attributes_count];// 属性数组,用于存储类、字段和方法的附加信息,如注解、源码行号等。
}

前4个字节是固定的魔数,用于标识该文件是否为有效的Java字节码文件

编译就是将Java源文件转化为JVM认识的16进制的class文件格式

什么是u2,u4?

u2: 代表数据占两个字节
u4: 代表数据占四个字节

JVM 加载过程都是什么步骤?

首先是加载,将编译好的class文件转为二进制流,将二进制流中类的信息存入方法区中,类对象存入堆中,然后是链接,链接包括三个阶段
第一个阶段是验证,验证加载的类的正确性,是否符合class文件规范,第二个阶段就是准备,在方法区中为静态变量分配空间,并设置初始值,将常量池中的符号引用转为直接引用,接下来是初始化,主要完成静态块执行以及静态变量的赋值

1. 装载

  • 获取类的全限定类名,把class文件转化为二进制流
  • 把二进制流中类的描述信息存入方法区中。如:创建时间、版本等
  • 将java.lang.Class对象存入堆中

2. 链接

  • 验证:验证被加载类的正确性:如文件的格式,元数据等。
  • 准备:在方法区中为静态变量分配空间,并设置初始值。
  • 解析:把类的符号引用转为直接引用。
    • 符号引用:class文件定义的内容
    • 直接引用:JAVA进程中真实的地址

3. 初始化
为类的静态变量设置默认值、执行静态代码块。

什么是类加载器?

类加载器是一个用来加载类文件的类。
在JVM中 不同的类加载器加载不同的类
启动类加载器(Bootstrap classLoader): 主要负责加载JAVA中的一些核心类库,主要是位于<JAVA_HOME>/lib/rt.jar中。
扩展类加载器(Extension classLoader): 主要加载JAVA中的一些扩展类,位于<JAVA_HOME>/lib/ext中,是启动类加载器的子类。
应用类加载器(System classLoader): 主要用于加载CLASSPATH路径下我们自己写的类,是扩展类加载器的子类。

什么是双亲委派模型

如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则继续向上委托,最终到达顶层的启动类加载器。如果父类加载器可以完成加载任务,就成功返回。如果父类加载器无法完成加载任务,子类加载器才会尝试自己去加载

在这里插入图片描述

如何打破双亲委派机制?

自定义类加载器类,继承ClassLoader 类,重写loadClass方法

什么是 tomcat 类加载机制?

在这里插入图片描述

当 tomcat启动时,会创建几种类加载器:
Bootstrap 引导类加载器 加载 JVM启动所需的类,以及标准扩展类(位于 jre/lib/ext 下)
System 系统类加载器 加载 tomcat 启动的类,比如bootstrap.jar,通常在 catalina.bat 或者 catalina.sh 中指定。位于 CATALINA_HOME/bin下。
Common 通用类加载器

什么是JVM内存模型?

在这里插入图片描述

  • JDK 1.6:有永久代,静态变量存放在永久代上。
  • JDK 1.7:有永久代,但已经把字符串常量池、静态变量,存放在堆上。逐渐的减少永久代的使用。
  • JDK 1.8:无永久代,运行时常量池、类常量池,都保存在元数据区,也就是常说的元空间。但字符串常量池仍然存放在堆上。

JVM 按照线程是否共享将内存分为两大类

线程独享区
只用当前线程能访问的数据区域,线程之间不能共享
线程独享去随着线程的创建而创建,随着线程的销毁而被回收

线程共享区
所有的线程都可以访问
当线程被销毁的时候,共享区的数据不会被立即回收,需要等待达到垃圾回收的阈值之后才会进行回收

1.程序计数器
当同时进行的线程数超过CPU数或其内核数时,就要通过时间片轮询分派CPU的时间资源,不免发生线程切换。这时,每个线程就需要一属于自己的计数器来记录下一条要运行的指令。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为空。
较小的内存空间、线程私有,记录当前线程所执行的字节码行号。

2.虚拟机栈
存放当前线程中所声明的变量,包括基本数据类型的数据和引用类型的数据的引用。
引用数据类型的引用存放在虚拟机栈中,而对象存放在堆内存中,引用数据类型占用四个字节存放地址
栈帧
每一个线程都会对应一个虚拟机栈,线程中的每个方法都会创建一个栈帧,存放局部变量,操作数栈,常量数据的引用,方法返回值的地址

虚拟机栈溢出异常
栈帧调用的深度太深,会出现虚拟机栈溢出异常StackOverflowError(SOF异常)。一般手动方法的调用是不会出现这个异常的,如果出现了这个异常,99%是由于递归造成的。
可以通过修改虚拟机栈的内存大小设置栈帧的最大深度,指令为:-Xss虚拟机栈内存大小
一般栈帧的深度达到3000~5000即可
太小:虚拟级栈容易溢出
太大:每个线程占据的内存太大,影响线程数量

3.本地方法栈
与虚拟机栈作用相似。但它不是为Java方法服务的,而是本地方法(C语言)。由于规范对这块没有强制要求,不同虚拟机实现方法不同。

4.堆
线程共享的(所有的线程共享一份). 存放对象的,new 的对象都存储在这个区域.还有就是常量池

5.方法区
在 java8 之后,我们把方法区称之为元空间(MetaSpace),方法区在逻辑上属于堆的一部分,但一些具体机制和堆有所区别,如:一些JVM 的方法区是可以不进行垃圾回收的,关闭 JVM 时才会释放方法区内存。所以方法区还有一个别名叫非堆,目的是和堆分开。方法区会存储类信息、静态变量、常量(JDK8 之后不存放字符串常量)、本地机器指令。

如果加载大量 class 文件,也会造成方法区内存溢出,如一个 tomcat 运行 20~30 个项目

什么是JVM执行引擎

执行引擎是Java虚拟机核心的组成部分之一。JVM将字节码装载到内存中,但是字节码并不能直接运行在操作系统之上。为了执行内存中的字节码文件指令,执行引擎(Execution Engine)就要将字节码指令解释/编译为对应平台上的本地机器指令。

执行引擎的翻译过程为两种:

  1. 通过解释器将字节码文件转化为机器指令执行;
  2. 使用即时编译器(JIT)将字节码文件的二进制流编译成机器指令执行

目前市面上主流的JVM采用解释器与即时编译器并存的架构。在Java虚拟机运行时,解释器即时编译器相互协作,取长补短。

什么是解释器与即时编译器

解释器每次解释都会将字节码文件解释为机器指令。整体效率较低,但当程序启动后,解释器可以马上发挥作用,省去编译的时间,立即执行。

即时编译器则会将字节码文件编译成机器指令,存在方法区,编译完成后直接执行本地机器指令即可。编译器吧代码编译成本地代码需要一定的执行时间,但编译为本地代码后执行效率高。

当Java虚拟机启动时,解释器首先发挥作用,不必等待及时编译器全部编译完成后再执行。随着时间的推移,编译器把越来越多的代码编译成本地代码,此时运行本地机器指令,获得更高的执行效率。

简述Java的对象结构

在这里插入图片描述

Java对象在内存中主要有以下几个部分:
对象头
MarkWord:一系列标记位(哈希码、分代年龄、锁标记状态等),在64位系统中占8个字节。
ClassPoint:对象对应的类信息的内存地址,在64位系统中占8字节。
Length:数组对象持有,表示数组长度,占4个字节。

实例数据
包含了对象的所有成员变量,大小由变量类型决定。

类型字节
byte1 字节
short2 字节
int4 字节
long8 字节
char2~3 字节
float4 字节
double8 字节
boolean1 字节
引用类型8 字节

对齐填充
将对象大小填充为8字节的整数倍

为什么要进行垃圾回收?

如果对象只创建不回收,会造成堆内存溢出OutOfMemoryError(OOM)异常。
可以修改堆内存大小的指令
-Xms10M 初始堆内存大小为10M
-Xmx10M 最大堆内存大小为10M

为什么要进行堆内存分区:

  1. 提高搜索垃圾的效率。
  2. 垃圾回收后可以更好的利用内存空间,存放大对象。
  3. 尽可能减少GC次数

简述一下JVM堆内存的划分

老年代:
对象会优先分配到新生代内存中,每次GC后没有回收的对象年龄加一,年龄到15还没有被回收,对象会存放到老年代内存中;如果对象较大,超过新生代内存的一半,对象也会存放到老年代区域。

新生代
为了减少young去垃圾回收后的空间碎片,新生代有分为Eden区和连个Survivor区,且始终有一个Survivor区保持闲置。对象会先存放到Eden区当中,Eden区空间满了之后会进行young区的垃圾回收,之后将young区所有存活的对象复制到闲置的Survivor区中,并清空Eden区和正在使用的Survivor区。

什么是YoungGC和OldGC

YoungGC

新生代区域的垃圾回收称之为YoungGC,也叫MinorGC,Eden区满后会触发YoungGC

OldGC

老年代区域的垃圾回收称之为OldGC,也叫MajorGC,OldGC非常浪费性能,所以我们的JVM调优要尽可能减少OldGC的次数,OldGC往往伴随着YoungGC。YoungGC+OldGC=FullGC

Survivor区空间并不大,如果满了怎么办?

  1. 一般情况下GC会回收95%的对象,且超过15次GC的对象会存放到old区,所以Survivor区不容易满。
  2. 如果Survivor区满了,会触发担保机制,提前将对象存入Old区。

为什么需要Survivor区?

为了减少垃圾回收带来的空间碎片,空间碎片过多会频繁触发YoungGC。

为什么需要两块Survivor区?

为了减少Survivor区的空间碎片。

如何判断一个对象是垃圾

引用计数法:
如果操作对象,必须通过引用来进行。如果一个对象没有任何引用与之关联,则说明该对象基本不可能在其他地方被使用到。那么这个对象就成为可被回收的对象了。这种方法实现简单,效率高,但是无法解决循环引用的问题,因此Java中并没有采取这种方式(Python采用的引用计数法)。
可达性分析:
以一个GC Root 对象作为起点进行搜索,如果在GC Roots 和对象之间没有可达路径,则称该对象是不可达的。
GC ROOT 对象:
栈帧中本地变量表引用的对象
方法区中静态属性引用的对象
方法区中常量引用的对象
本地方法栈中引用的对象

你知道哪些垃圾收集算法?

标记——清除算法: 效率较低,有空间碎片。Old区使用的算法
在这里插入图片描述
在这里插入图片描述

复制算法: 空间碎片少,但会浪费空间。存活对象较少才会使用的算法。young区使用的算法。
在这里插入图片描述

标记——整理算法: 空间碎片少,效率较低。Old区使用的算法。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

什么是垃圾收集器?如何判断一个垃圾收集器的好坏呢?

垃圾收集器是对垃圾回收算法的实现。
垃圾收集器的执行效率= 吞吐量 / 停顿时间
吞吐量 = 用户代码执行时间 / (用户代码执行事件+停顿时间)

说一下 JVM 有哪些垃圾收集器?

串行收集器: 只有一个垃圾回收线程,在垃圾回收时暂停用户代码线程,如 Serial 和 Serial Old收集器。
在这里插入图片描述

并行收集器: 吞吐量优先,多个垃圾收集器线程共同工作, 尽快完成垃圾收集。如 ParNew,Parallel Scanvenge, Parallel Old 收集器

在这里插入图片描述

并发收集器: 停顿时间优先,用户线程和垃圾回收线程一同工作,用户代码线程也会完全停止一小段时间,如 CMS,G1 收集器。
在这里插入图片描述

CMS收集器

CMS(concurrent mark sweep,并发标记扫描)收集器是并发收集器,是基于标记 ——清理的算法进行垃圾回收,用于 OldGC
优点:并发收集、低停顿
缺点:会产生大量空间碎片,停顿时间虽然短但是不可控。

问:CMS 收集器为什么不进行并发的初始标记?
因为初始标记速度很快,不值得多开线程,开线程也是需要耗费资源的

G1 收集器

G1(garbage first,垃圾优先)收集器是并发收集器,从 JDK1.7 开始支持,能进行OldGC 和 YoungGC。Old 区采用标记整理算法,Young 区采用复制算法。
G1 收集器没有固定的 Old、Young、Eden、Survivor 区,而是将内存分为一个个大小相等的 Region(格子,1Mb~32Mb)。每次垃圾回收后,Region 的用途可以发生改变,提高了内存的灵活性和利用率。
在这里插入图片描述
G1 收集器可以根据开发者设置的参数,停顿时间的期望值,优先筛选回收存活的对象比较少,垃圾对象比较大的区域 Region,可以把更多空余的空间释放出来。

在这里插入图片描述

ZGC 收集器

ZGC 从 JDK11 开始支持,目前还是一个实验性版本,原理类似 G1。是目前收集效率最高的垃圾收集器,平均暂停时间为 0.05 毫秒。

如何选择垃圾收集器?

优先让服务器自己来选择

  • 如果内存小于 100M,使用串行收集器 参数: -XX:+UseSerialGC
  • 如果服务器是单核,并且没有停顿时间要求,使用串行收集器 参数: -XX:+UseSerialGC
  • 如果你的应用是“吞吐量”优先的,并且对较长时间的停顿没有什么特别的要求。选择并行收集器是比较好的。参数: -XX:+UseParallelGC
  • 如果你的应用对响应时间要求较高,想要较少的停顿。甚至 1 秒的停顿都会引起大量的请求失败,那么选择 G1 、 ZGC 、 CMS 都是合理的。虽然这些收集器的 GC 停顿通常都比较短,但它需要一些额外的资源去处理这些工作,通常吞吐量会低一些。
    参数:
    -XX:+UseConcMarkSweepGC
    -XX:+UseG1GC
    -XX:+UseZGC 等。

如何设置JVM的参数?

Intellij idea:在运行设置的 VM Option 中设置。
tomcat:进入 Tomcat 的 bin 目录下,打开文件 catalina.bat/catalina.sh,修改如下参数。

set "JAVA_OPTS=参数"

JVM常用命令

jps:查看当前执行的所有 JAVA 进程
jinfo:实时查看 JVM 参数
jinfo -flag InitialHeapSize PID:JAVA 进程堆内存大
jinfo -flag UseG1GC PID:JAVA 进程是否使用 G1GC
jinfo -flag UseParallelGC PID:JAVA 进程是否使用 ParallelG
jstat:虚拟机性能信息
jstat -class PID 1000:每秒查看一次虚拟机中类加载信息
jmap:打印快照
jmap -heap PID:查看堆存储快照
jmap -dump:format=b,file=heap.hprof PID:在出现内存溢出异常时,将堆内存的信息下载到文件中

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

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

相关文章

C# 给List编个序号

给List编个号 int[] numbers { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };int i 0;var q (from n in numbersselect (index:i,number:n)).ToList();foreach (var v in q) {Console.WriteLine($"i {v.index}, v {v.number}"); }

关于刷题时使用数组的小注意事项

&#x1f4af; 博客内容&#xff1a;关于刷题时使用数组的小技巧 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#…

Python如何实现多线程编程

目录 线程的创建 线程的管理 线程的同步 线程池 线程同步和锁 总结 Python是一种广泛使用的编程语言&#xff0c;它具有丰富的库和工具&#xff0c;可以用来实现多线程编程。多线程编程是一种并行计算技术&#xff0c;它通过将任务划分为多个独立的任务并利用多个线程同时…

vue实现在页面拖拽放大缩小div并显示鼠标在div的坐标

1、功能要求&#xff1a; 实现在一个指定区域拖拽div,并可以放大缩小&#xff0c;同时显示鼠标在该div里的坐标&#xff0c;如图可示 缩小并拖动 2、实现 <div class"div_content" ref"div_content"><div class"div_image" id"…

C++(Qt)软件调试---linux使用dmesg定位程序崩溃位置(14)

C(Qt)软件调试—linux使用dmesg定位程序崩溃位置&#xff08;14&#xff09; 文章目录 C(Qt)软件调试---linux使用dmesg定位程序崩溃位置&#xff08;14&#xff09;1、前言2、ELF文件3、常用工具4、使用dmesg定位异常位置1.1 异常发生在可执行程序中1.2 异常发生在动态库中 1、…

C++算法:二叉树的序列化与反序列化

#题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。…

花生好车基于 KubeSphere 的微服务架构实践

公司简介 花生好车成立于 2015 年 6 月&#xff0c;致力于打造下沉市场汽车出行解决方案第一品牌。通过自建直营渠道&#xff0c;瞄准下沉市场&#xff0c;现形成以直租、批售、回租、新能源汽车零售&#xff0c;四大业务为核心驱动力的汽车新零售平台&#xff0c;目前拥有门店…

[自定义 Vue 组件] 小尾巴 Logo 组件 TailLogo

文字归档于&#xff1a;https://www.yuque.com/u27599042/coding_star/apt6y731ybmxgu5g 组件效果 组件依赖 自定义字符串工具函数 stringIsNull https://www.yuque.com/u27599042/coding_star/slncupw7un3ce7cb import {stringIsNull} from "/utils/string_utils.js&q…

移动App安全检测的必要性,app安全测试报告的编写注意事项

随着移动互联网的迅猛发展&#xff0c;移动App已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;虽然App给我们带来了便利和乐趣&#xff0c;但也伴随着一些潜在的安全风险。黑客、病毒、恶意软件等威胁着用户的隐私和财产安全&#xff0c;因此进行安全检测就显得尤为…

acwing算法基础之数据结构--KMP算法

目录 1 知识点2 模板 1 知识点 KMP算法已经集成到string类型的find()方法了&#xff0c; 但这里我们不用这个&#xff0c;我们自己来实现这个方法。 KMP算法的关键步骤&#xff1a; p[N]表示输入模式串&#xff0c;求取该模式串的ne[]数组。ne[i]表示前缀等于后缀的长度&…

UE4 UltrDynamicSky与场景物体进行交互

找到材质 找到其最父类的材质 把这个拖过去连上即可

TikTok Shop新结算政策:卖家选择权加强,电商市场蓄势待发

据悉&#xff0c;从2023年11月1日开始&#xff0c;TikTok Shop将根据卖家的店铺表现来应用3种不同类型的结算期&#xff0c;其中&#xff0c;标准结算期&#xff1a;资金交收期为8个日历日&#xff1b;快速结算期&#xff1a;资金交收期为3个日历日&#xff1b;延长结算期&…

尚硅谷Flink(完)FlinkSQL

&#x1f9d9;FlinkSQL&#x1f3c2;&#x1f93a; Table API 和 SQL 是最上层的 API&#xff0c;在 Flink 中这两种 API 被集成在一起&#xff0c;SQL 执行的对象也是Flink 中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。 SQL API 是基于…

Python学习基础笔记七十七——json序列化

客户端和服务端之间需要交换数据才能完成各种功能。 假设 服务端程序都是用Python语言开发的话&#xff0c;那么 服务端从数据库中获取的最近的交易列表&#xff0c;可能就是像下面这样的一个Python列表对象&#xff1a; historyTransactions [{time : 20170101070311, #…

mysql过期数据的清理方案(Java/springboot+mybatis)

比如说现在数据库表信息增加的很快&#xff0c;然后我们需要对每个表设置过期删除策略&#xff1b; 大概思路就是&#xff1a;定时任务调度&#xff0c;给每个表制定sql&#xff0c;然后执行删除数据的sql //删除一个月前的数据 delete FROM test_info WHERE create_time <…

C++初阶--C++入门(2)

C入门&#xff08;1&#xff09;链接入口 文章目录 内联函数auto关键字注意事项 基于范围的for循环(C11)nullptr 内联函数 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提…

ND协议——无状态地址自动配置 (SLAAC)

参考学习&#xff1a;计算机网络 | 思科网络 | 无状态地址自动配置 (SLAAC) | 什么是SLAAC_瘦弱的皮卡丘的博客-CSDN博客 与 IPv4 类似&#xff0c;可以手动或动态配置 IPv6 全局单播地址。但是&#xff0c;动态分配 IPv6 全局单播地址有两种方法&#xff1a; 如图所示&#…

『C++ - STL』之优先级队列( priority_queue )

文章目录 前言优先级队列的结构优先级队列的模拟实现仿函数 最终代码 前言 什么是优先级队列&#xff0c;从该名中可以知道他一定有队列的一定属性&#xff0c;即先入先出(LILO)&#xff0c;而这里的优先级则可以判断出它的另一个特点就是可以按照一定的条件将符合该条件的先进…

移动设备管理对企业IT 安全的增强

移动设备管理 &#xff08;MDM&#xff09; 是通过定义策略和部署安全控制&#xff08;如移动应用程序管理、移动内容管理和条件 Exchange 访问&#xff09;来管理移动设备的过程。 完整的MDM解决方案可以管理在Android&#xff0c;iOS&#xff0c;Windows&#xff0c;macOS&a…

【论文解读】单目3D目标检测 DD3D(ICCV 2021)

本文分享单目3D目标检测&#xff0c;DD3D 模型的论文解读&#xff0c;了解它的设计思路&#xff0c;论文核心观点&#xff0c;模型结构&#xff0c;以及效果和性能。 一、DD3D简介 DD3D是一种端到端、单阶段的单目3D目标检测方法&#xff0c;它在训练时用到了点云数据&#xf…