当前位置: 首页 > news >正文

JVM(八股文)

目录

一、JVM简介

二、JVM中的内存区域划分

三、JVM加载

1.类加载

1.1 加载

1.2 验证

1.3 准备

1.4 解析

1.5 初始

1.6 总结

2.双亲委派模型

四、JVM 垃圾回收(GC)

1.确认垃圾

1.1 引用计数

1.2 可达性分析(Java 采用的方案)

2.释放“垃圾”对象

2.1 标记清除

2.2 复制算法

2.3 标记整理

2.4 分代回收

3.垃圾收集器

3.1 CMS收集器(老年代收集器,并发GC)

3.2 G1收集器(唯一一款全区域的垃圾回收器)


在JVM中,我们主要去讨论以下的问题:

1. JVM中的内存区域划分

2. JVM的类加载机制

3. JVM中的垃圾回收策略


一、JVM简介

JVM Java Virtual Machine 的简称,意为 Java 虚拟机

虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统

JVM的执行流程:

程序在执行之前先要把 java 代码转换成字节码( class 文件), JVM 首先需要把字节码通过一定的方式 类加载器( ClassLoader 把文件加载到内存中 运行时数据区( Runtime Data Area ,而字节码 文件是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 行引擎( Execution Engine 将字节码翻译成底层系统指令再交由 CPU 去执行,而这个过程中需要调 用其他语言的接口 本地库接口( Native Interface 来实现整个程序的功能,这就是这 4 个主要组成部分的职责与功能。

二、JVM中的内存区域划分

JVM其实是一个 Java 进程,Java进程会从操作系统申请一大块区域,给java代码使用。

这一大块区域进一步划分出不同的用途:

new 出来的对象(成员变量)
维护方法之间的调用关系(局部变量)
方法区(旧)/ 元数据区(新)放的是类加载之后的类对象(静态变量)

🙈经典考点:给一段代码,问某个变量处于内存的哪个区域


🙉看变量的形态:局部变量、成员变量、静态变量

具体内存区域划分:

🔺🔺总结

1.堆的作用:程序中创建的所有对象都在保存在堆中

2.Java 虚拟机栈的作用:Java 虚拟机栈的生命周期和线程相同,Java 虚拟机栈描述的是 Java 方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。咱们常说的堆内存、栈内存中,栈内存指的就是虚拟机栈

3.虚拟机栈:给 java 代码使用

4.本地方法栈:给 jvm 内部的本地方法使用的(JVM 内部通过 C++代码实现的方法)

5.程序计数器:记录当前程序指定到哪个指令(相当于一个简单的 long 类型的变量存了一个内存地址,内存地址就是下一个要执行的 字节码 所在的地址)

6.方法区的作用:用来存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的。

7.堆和元数据区在JVM进程中只有一份,栈(本地方法栈)和程序计数器则是存在多份,每个线程都有一份

三、JVM加载

1.类加载

简单来说就是:把 .class 文件加载到内存,得到类对象的过程

对于一个类来说,可以总结成五个词(要记住):

1.1 加载

找到 .class 文件,并且读文件内容

1.2 验证

验证是连接阶段的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。

1.3 准备

给类对象分配内存空间(类加载最终就是为了得到类对象),即未初始化的空间,内存空间中的数据全是0(类对象中的静态成员也是全0的)

1.4 解析

针对 字符串常量 进行初始化,也就 Java 虚拟机将常量池内的符号引用替换为直接引用的过程

        字符串常量在 .class 文件中就存在了,但是他们只是知道彼此之间的相对位置(偏移量),不知道自己在内存中的实际地址,这个时候的字符串常量就是符号引用

        真正加载到内存中,就会把字符串常量填充到内存中的特定地址上,字符串常量之间的相对位置还是一样的但是这些字符串有了自己真正的内存地址,此时的字符串就是直接引用(Java中的普通引用)

        例如:一个班级组织学生去看电影,学生需要在操场集合,站队的时候谁在前谁在后位置是固定的,这个时候张三和李四在一排站着,但是在路上走的时候,可能走着走着队伍变形了,这个时候张三想和李四一起走就需要进行调整,保持一个走位和李四走在一起,最后仍然可以保证进场之后张三和李四坐在一起

1.5 初始

针对类对象进行初始化(初始化静态成员,执行静态代码块,类要是有父类还需加载父类...)

1.6 总结

类加载什么时候触发?不是 jvm 一启动,就会把所有的 .class 都加载了!!整体是一个“懒加载”的策略(懒汉模式),即非必要,不加载

什么叫做“必要”:

1.创建了类的实例

2.使用了这个类的静态方法/静态属性

3.使用子类会触发父类的加载

2.双亲委派模型

类加载中最关键的一个考点——双亲委派模型(在第一个步骤中,找 .class 文件 这个过程)

        如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

        在JVM中内置了三个 类加载器:

BootStrap ClassLoader负责加载 Java标准库中的类
Extension ClassLoader负责加载一些非标准的 Sun/ Oracle 扩展库的类
Application ClassLoader负责加载项目中自己写的类以及第三方库中的类

具体加载一个类的时候,过程如下:需要先给定一个类的全限定类名“java.lang.String”(字符串)

以上历程在日常工作中也经常存在:把 BootStrap 想象成公司老板,Extension 想象成主管,Application 想象成基层员工

双亲委派模型优点:

1.避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了。

2.安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户自己提供的因此安全性就不能得到保证了。

四、JVM 垃圾回收(GC)

帮助程序猿自动释放内存的

        C语言中,malloc 的内存必须手动 free,否则就容易出现内存泄露(光申请内存不释放,内存逐渐用完了,导致程序崩溃;内存泄漏是C++程序猿职业生涯中的头号杀手);Java等后续的编程语言引入了 GC 来解决上述问题,能有效的减少内存泄漏的出现概率。

        内存的释放是一件比较纠结的事情,申请的时机是明确的(使用了必须要申请),释放的时机是模糊的(彻底不使用才能释放)。C/C++做法是完全让程序猿来决定,比较不靠谱的,特别依赖程序猿的水平;而 Java 通过 JVM 自动判定,基于一系列策略就可以让这个准确性比较高,但是也会付出一些代价

JVM 中的内存有好几个区域,是释放哪个部分的空间?堆!!!(new 出来的对象)

        程序计数器就是一个单纯存地址的整数,不需要,是随着线程一起销毁;栈也是随着线程一起销毁,方法调用完毕,方法的局部变量自然随着栈操作就销毁了;元数据区/方法区,存的类对象很少会“卸载”。

        堆!!!就成了GC的主要目标 :GC也就是以对象为单位进行释放的(说是释放内存,其实是释放对象)

GC中主要分成两个阶段:

1.找——确认垃圾

2.释放——把垃圾对象的内存给释放掉

这个时候就涉及到了垃圾回收算法

1.确认垃圾

一个对象如果后续再也没用了,就可以认为是垃圾:Java中使用一个对象,只能通过引用,如果一个对象没有引用指向它,此时这个对象一定是无法被使用的(托托的是垃圾);如果一个对象已经不想用了,但是这个引用可能还指向着呢这种情况下JVM是没法考虑到的;因此 Java 中只是单纯通过引用没有指向这个操作来判定垃圾的

java 怎样知道一个对象是否有引用指向呢

1.1 引用计数

给对象里安排一个额外的空间,保存一个整数表示对象有几个引用指向(Java 实际上没使用这个方案,Python、PHP采取的

两个缺陷:

1️⃣浪费内存空间

2️⃣存在循环引用的情况:会导致引用计数的判定逻辑出错

1.2 可达性分析(Java 采用的方案)

把对象之间的引用关系理解成一个树形结构,从一些特殊的七点触发进行遍历,只要能遍历访问到的对象就是“可达”,再把“不可达的”当做垃圾即可 

可达性分析关键要点:进行上述遍历,需要有“起点”(GC Roots):

1️⃣栈上的局部变量(每个栈的每个局部变量,都是起点)

2️⃣常量池中引用的对象

3️⃣方法区中,静态成员引用的对象

 可达性分析:从所有的 GC Roots 的起点出发,看看该对象里又通过引用能访问哪些对象,顺藤摸瓜,把所有可以访问的对象都给遍历一遍(遍历的同时把对象标记成“可达”)

剩下的自然就是“不可达”

  • 可达性分析克服了引用计数器的两个缺点,但是也有自己的问题:

1️⃣消耗更多的时间(某个对象成了垃圾也不一定第一时间发现,因为扫描的过程需要消耗时间的)

2️⃣在进行可达性分析的时候,要顺藤摸瓜,一旦这个过程中,当前代码中对象的引用关系发生变化了,就麻烦了

因此为了更准确的完成这个“摸瓜”的过程,需要让其他的业务线程暂停工作!!(STW 问题)

2.释放“垃圾”对象

三种典型的策略:1️⃣标记清除2️⃣复制算法3️⃣标记整理

2.1 标记清除

2.2 复制算法

把整个内存空间分成两段,一次只用一半

复制算法解决了内存碎片问题,但是也有缺点:

1️⃣内存利用率比较低

2️⃣如果当前的对象大部分都要保留的,垃圾很少,此时复制成本就比较高

2.3 标记整理

类似于顺序表删除中间元素,有一个搬运过程

1️⃣解决内存碎片问题

2️⃣搬运开销比较大,不适合频繁进行

以上三种策略不能直接解决问题,因此实际上,JVM 的实现思路是结合上述几种思想方法——分代回收

2.4 分代回收

分代回收思想:给对象设定了“年龄”这样的概念,即描述了这个对象存在多久了;如果一个对象刚诞生,认为是0岁,每次经过一轮扫描(可达性分析),如果没被标记成垃圾,这个时候对象就涨一岁。通过年龄来区分对象的存活时间(经验规律:如果一个对象存活时间很长了,他将继续存在更长的时间)

分代回收:针对不同的情况使用不同的策略(取长补短)即针对不同年龄的对象采取不同的回收策略

Java堆分为新生代和老年代

1️⃣新创建的对象放在伊甸区:当垃圾回收扫描到伊甸区之后,绝大部分对象都会在第一轮 GC 中就会被干掉,即大部分对象活不过一岁

2️⃣如果伊甸区的对象熬过第一轮 GC,就会通过复制算法拷贝到生存区:生存区分成两半(大小均等),一次只使用其中一半(垃圾回收扫描伊甸区的对象,也是发现垃圾就淘汰,对于不是垃圾,通过 复制算法 复制到生存区的另一半)

3️⃣当这个对象在生存区熬过若干轮 GC 之后,年龄增长到一定程度了,就会通过 复制算法 拷贝到老年代

4️⃣进入老年代的对象,年龄都挺大,再消亡的概率比前面新生代中的对象小不少,针对老年代的 GC 的扫描频次就会降低很多;如果老年代中发现某个对象是垃圾了,使用标记整理的方式清除

5️⃣特殊情况:如果对象非常大,直接进入老年代(大对象进行复制算法,成本比较高,而且大对象也不会很多)

3.垃圾收集器

        垃圾收集器是垃圾回收算法(引用计数法、标记清楚法、标记整理法、复制算法)的具体实现,不同垃圾收集器、不同版本的JVM所提供的垃圾收集器可能会有很在差别。

        垃圾回收器是具体的实现方式:具体实现的时候往往基于上述思想方法做出一些改进和优化,包含更多复杂的细节(只作为了解即可),java版本的变更,垃圾回收器也在不断变化

3.1 CMS收集器(老年代收集器,并发GC

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。

特点:

  1. 针对老年代,采用标记-清楚法清除垃圾;
  2. 基于"标记-清除"算法(不进行压缩操作,产生内存碎片);
  3. 以获取最短回收停顿时间为目标;
  4. 并发收集、低停顿;
  5. CMS收集器有3个明显的缺点:1.对CPU资源非常敏感、2.无法处理浮动垃圾,可能出现"Concurrent Mode Failure"失败、3.产生大量内存碎片
  6. 垃圾收集线程与用户线程(基本上)可以同时工作

3.2 G1收集器(唯一一款全区域的垃圾回收器)

G1(Garbage First)垃圾回收器是用在heap memory很大的情况下,把heap划分为很多很多的region块,然后并行的对其进行垃圾回收;G1垃圾回收器在清除实例所占用的内存空间后,还会做内存压缩。G1垃圾回收器回收region的时候基本不会STW,而是基于 most garbage优先回收(整体来看是基于"标记-整理"算法,从局部(两个region之间)基于"复制"算法) 的策略来对region进行垃圾回收的

  • 能充分利用多CPU、多核环境下的硬件优势;
  • 可以并行来缩短(Stop The World)停顿时间;
  • 也可以并发让垃圾收集与用户程序同时进行;
  • 分代收集,收集范围包括新生代和老年代
  • 能独立管理整个GC堆(新生代和老年代),而不需要与其他收集器搭配;
  • 能够采用不同方式处理不同时期的对象;
  • 应用场景可以面向服务端应用,针对具有大内存、多处理器的机器;
  • 采用标记-整理 + 复制算法来回收垃圾

相关文章:

JVM(八股文)

目录 一、JVM简介 二、JVM中的内存区域划分 三、JVM加载 1.类加载 1.1 加载 1.2 验证 1.3 准备 1.4 解析 1.5 初始 1.6 总结 2.双亲委派模型 四、JVM 垃圾回收(GC) 1.确认垃圾 1.1 引用计数 1.2 可达性分析(Java 采用的方案&a…...

C#WPF标记扩展应用实例

本文介绍C#WPF标记扩展应用实例 一、标记扩展 标记扩展是一个 XAML 语言概念。 用于提供特性语法的值时,大括号({ 和 })表示标记扩展用法。 此用法指示 XAML 处理不要像通常那样将特性值视为文本字符串或者可转换为字符串的值。就是类似于值用变量的意思。 WPF 应用编程中…...

四维曲面如何画?matlab

clc; clear all [theta,phi]meshgrid(linspace(0,pi,50),linspace(0,2*pi,50)); zcos(theta); xsin(theta).*cos(phi); ysin(theta).*sin(phi); f-1*((x.*y).2(y.*z).2(z.*x).^2); surf(sin(theta).*cos(phi).*f,sin(theta).*sin(phi).*f,cos(theta).*f,f) 结果...

软件培训测试高级工程师多测师肖sir__html之作业11

html之作业 案例1&#xff1a; 截图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表单</title></head><body><table style"background-color:red" bo…...

详解一典型的反激式开关电源方案

理解一个单端反激式开关电源方案&#xff1a; 1、抛出问题&#xff1a; 如图&#xff0c;在某系统方案上看到下图所示的单端反激式开关电源方案。 2、解析问题&#xff1a; 2.1、乍一看&#xff1a; 典型的AC-DC电路&#xff0c;考虑了安规及过压过流保护&#xff0c;如&am…...

AI 大框架基于python来实现基带处理之TensorFlow(信道估计和预测模型,信号解调和解码模型)

AI 大框架基于python来实现基带处理之TensorFlow(信道估计和预测模型,信号解调和解码模型) 基带处理&#xff08;Baseband Processing&#xff09;是一种信号处理技术&#xff0c;用于在通信系统中处理和调制基带信号。基带信号是指未经过调制的信号&#xff0c;通常包含原始数…...

阿里云上了新闻联播

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 阿里新任的CEO吴泳铭上央视新闻联播了! 在昨天的新闻联播里&#xff0c;出席科技座谈会&#xff0c;有一个特别镜头&#xff0c;出现了阿里新任CEO吴泳铭的镜头。 这个信号意义明显&#xff0c;我…...

算法练习12——跳跃游戏

LeetCode 55 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 贪…...

Java架构师系统架构设计服务拆分

目录 1 服务拆分和子系统模块拆分1.1 服务化架构的优势2 描绘系统蓝图里面的详解服务2.1 为什么拆分服务3 服务拆分的基本要求3.1 服务功能是自包含的3.2 服务呢应该具备独立性和专业性3.3 服务是无状态的3.4 服务之间采用轻量级的通讯机制4 服务拆分的基本方法4.1 按业务边界拆…...

通用任务批次程序模板

通用批次任务模板 我们总会遇到需要使用批次任务处理问题的场景&#xff0c;任务有很多不同类型的任务&#xff0c;同时这些任务可能都有大致相同&#xff0c;甚至抽象出来共同的执行阶段状态。 任务的执行肯定无法保证一帆风顺&#xff0c;总会在某个时间阶段被打断&#xff…...

Rust专属开发工具——RustRover发布

JetBrains最近推出的Rust集成开发工具——RustRover已经发布&#xff0c;官方网站&#xff1a;RustRover: Rust IDE by JetBrains JetBrains出品过很受欢迎的开发工具IntelliJ IDEA、PyCharm等。 RustRover优势 Rust集成环境&#xff0c;根据向导可自动下载安装rust开发环境提…...

数据结构:链表(1)

顺序表的优缺点 缺点&#xff1a; 1.插入数据必须移动其他数据&#xff0c;最坏情况下&#xff0c;就是插入到0位置。时间复杂度O(N) 2.删除数据必须移动其他数据&#xff0c;最坏情况下&#xff0c;就是删除0位置。时间复杂度O(N) 3.扩容之后&#xff0c;有可能会浪费空间…...

软件测试之概念篇2(瀑布模型、螺旋模型、增量模型和迭代模型、敏捷模型,V模型、W模型)

目录 开发模型 &#xff08;1&#xff09;瀑布模型 &#xff08;2&#xff09;螺旋模型 &#xff08;3&#xff09;增量模型和迭代模型 &#xff08;4&#xff09;敏捷模型 &#xff08;5&#xff09;测试模型&#xff08;V模型、W模型&#xff09; V模型 W模型 开发模型…...

【【萌新的SOC学习之重新起航SOC】】

萌新的SOC学习之重新起航SOC ZYNQ PL 部分等价于 Xilinx 7 系列 FPGA PS端&#xff1a;Zynq 实际上是一个以处理器为核心的系统&#xff0c;PL 部分可以看作是它的一个外设。 我们可以通过使用AXI(Advanced eXtensible Interface)接口的方式调用 IP 核&#xff0c;系统通过 AX…...

ElasticSearch 学习7 集成ik分词器

网上找了一大堆&#xff0c;很多都介绍的不详细&#xff0c;开始安装完一直报错找不到plugin-descriptor.properties&#xff0c;有些懵这个东西不应该带在里面吗&#xff0c;参考了一篇博客说新建一个这个&#xff0c;新建完可以启动&#xff0c;但是插入索引数据会报错找不到…...

[NewStarCTF 2023 公开赛道] week1

最近没什么正式比赛&#xff0c;都是入门赛&#xff0c;有moectf,newstar,SHCTF,0xGame都是漫长的比赛。一周一堆制。 这周newstar第1周结束了&#xff0c;据说py得很厉害&#xff0c;第2周延期了&#xff0c;什么时候开始还不一定&#xff0c;不过第一周已经结束提交了&#…...

ThreeJS-3D教学六-物体位移旋转

之前文章其实也有涉及到这方面的内容&#xff0c;比如在ThreeJS-3D教学三&#xff1a;平移缩放物体沿轨迹运动这篇中&#xff0c;通过获取轨迹点物体动起来&#xff0c;其它几篇文章也有旋转的效果&#xff0c;本篇我们来详细看下&#xff0c;另外加了tween.js知识点&#xff0…...

BC v1.2充电规范

1 JEITA Reference to https://www.mianbaoban.cn/blog/post/169964 符合 JEITA 规范的锂离子电池充电器解决方案 2 Battery Fuel Gauge 2.1 Cycle Count&#xff08;充放电循环次数&#xff09; 此指令回传一只读字段&#xff0c;代表电芯组已经历的完整充放电循环数。当放电容…...

判断一个整数是否回文

回文数字的定义&#xff1a;第一位和最后一位相等&#xff0c;第二位和倒数第二位相等...依次类推&#xff0c;比如1221,12321等等&#xff0c;也就是说一个数字如果是回文&#xff0c;那么将它反转之后&#xff0c;一定和原来的值相等 解法一&#xff1a;投机取巧&#xff0c…...

【广州华锐互动】车辆零部件检修AR远程指导系统有效提高维修效率和准确性

在快速发展的科技时代&#xff0c;我们的生活和工作方式正在被重新定义。这种变化在许多领域都有所体现&#xff0c;尤其是在汽车维修行业。近年来&#xff0c;AR&#xff08;增强现实&#xff09;技术的进步为这个行业带来了前所未有的可能性。通过将AR技术与远程协助系统相结…...

简单实现接口自动化测试(基于python+unittest)

简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手&#xff0c;一步步调整优化接口调用&#xff0c;以及增加基本的结果判断&#xff0c;讲解Python自带的Unittest框架调用&#xff0c;期望各位可以通过本文对接口自动化测试有一个大致的了解。 引言 为什么要…...

【算法|双指针系列No.4】leetcode11. 盛最多水的容器

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…...

数据结构全集介绍

以下列举了部分常见的数据结构&#xff1a; 数组&#xff08;Array&#xff09;&#xff1a;数组是一种线性数据结构&#xff0c;可以用来存储固定大小的数据集合。在数组中&#xff0c;每个元素都有一个对应的索引&#xff0c;可以通过索引直接访问和更新元素。数组的优点是访…...

力扣刷题-字符串-反转字符串

344 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中…...

【CCNP】第七章 动态路由协议-BGP

第一节 BGP的基本概念 BGP&#xff08;Border Gateway Protocol&#xff09;&#xff0c;边界网关协议 是运行在网络和网络之间的协议&#xff0c;是一款EGP&#xff08;外部网关协议&#xff09; BGP基于TCP协议工作&#xff0c;目的端口号179。源端口随机&#xff0c;由路由…...

java学习--day24(stream流)

文章目录 今天的内容1.Stream【难点】1.1获取流的对象1.2Stream流对象下面1.2.1count和forEach1.2.2filter方法1.2.3limit1.2.4map方法1.2.5skip1.2.6concat 1.3收集流 1.基于接口和抽象类的匿名内部类的写法 abstract class Person {public abstract void eat(); } public sta…...

Multi-Grade Deep Learning for Partial Differential Equations

论文阅读&#xff1a;Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation符号定义偏微分方程定义FNN定义PI…...

Docker部署rustdesk

查看镜像版本 https://hub.docker.com/r/rustdesk/rustdesk-server/tags 拉取镜像 docker pull rustdesk/rustdesk-server:1.1.8-2创建挂载目录 mkdir -p /opt/rustdesk/{hbbr,hbbs}/root运行hbbs –nethost 仅适用于 Linux&#xff0c;它让 hbbs/hbbr 可以看到对方真实的…...

win1011安装MG-SOFT+MIB+Browser+v10b

文章目录 安装MG-SOFTSNMP服务配置安装MG-SOFT启动MIB-Browser以及错误解决MIB Browser使用 安装MG-SOFT win10和win11安装基本一样&#xff0c;所以参照下面的操作即可&#xff01; SNMP服务配置 打开设置&#xff0c;应用和功能&#xff0c;可选功能&#xff0c;选择添加功…...

PCL点云处理之Pcd文件读取、法线与曲率计算、多线程加速、属性字段合并 (二百零八)

PCL点云处理之Pcd文件读取、法线与曲率计算、多线程加速、属性字段合并(二百零八) 一、相关介绍二、算法实现1.代码一、相关介绍 (夜深人不静) 法线和曲率的计算是点云处理中常用的关键特征,PCL提供了特有的点类型PointNormal来记录这些信息,通过OMP多线程对相关的计算函…...