早上看Spring IO 2022 的时候看到这张图,可以帮助大家清楚的了解当前Spring Framework与Java版本之间的迭代关系
1.点击创建新的虚拟机; ? 01.png 2.点击“编辑虚拟机设置”,选择“CD/DVD”,点击"使用ISO映像文件"在本地找到合适的镜像文件; ?...02-01.png 4.点击“开启此虚拟机”进入到CentOS安装界面,选择“skip”; ? 03.png 5..选择简体中文语言,点击NEXT; ?...05.png 9.在网络设备这一框中点击右侧的编辑,在IPv4这一项中选择第二项,在IP Address中填入准备好的内网IP,在Prefix(Netmask)中填入255.255.255.0,点击确定...04.png 10.系统时钟默认即可,点击下一步; 11.设置根密码,再次确认后点击下一步; 12.CentOS默认安装一些互联网应用的软件; 13.在软件的定制里选择“现在定制”,点击下一步; ?...点击“前进”,在防火墙界面选择禁用;点击“前进”,在SELinux 选择禁用;创建一个非管理的日常使用的用户,点击“前进”;声卡等选择默认,点击“前进”,然后重新启动。
最近需要在项目中获取项目的版本号,最笨的方法莫过于硬编码一个版本号,当然我也是这么干的。不过闲下来的时候突发奇想Spring Boot项目中pom.xml定义的版本号能不能通过API获得呢?...在META-INF文件夹中找到了两个相关的东西,一个是MANIFEST.MF: Manifest-Version: 1.0 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx...Created-By: Maven Jar Plugin 3.2.0 Main-Class: org.springframework.boot.loader.JarLauncher 里面包含了我定义的版本号...String version = this.getClass().getPackage().getImplementationVersion() 但是用IDE启动发现version=null,不过用java...从配置文件读取 Maven在构建项目时可以通过资源插件将构建属性即pom.xml中的属性注入到指定的资源文件中,具体操作为: ... <!
JVM公司整体来说还是挺不错的,各方面条件都还不错。办公大厦有两层,一楼是native层,一堆native层的线程员工在下面办公。我在二楼的Java层,这一层都是Java线程。...但是高管BootstrapClassLoader只负责加载Java的核心类,我的领导也只负责加载一些扩展类,所以大部分时间请示完了结果他们都加载不了,还得让我去加载。...你们也知道在Java中,除了基础的强引用外,还有四种特殊的引用: FinalReference 软引用(SoftReference) 弱引用(WeakReference) 虚引用(PhantomReference...我的工作就是在垃圾回收时,把这些个特殊引用一个个加入到它们各自对应的队列里面去。...和楼上两位一样的是我也有一个工作队列,叫_vm_thread,其类型是VMOperationQueue。 和楼上两位不一样的是他们工作在二楼Java层,而我工作在一楼native层。
对于 Python 和 R 双修的同学,一个迫切的需求就是能够在同一个 jupyter 笔记本中调用两种语言,但是很可惜,完成两种语言互相调用的神包rpy2 并没有官方的 Windows 版本。...此外,R 中最好的数据处理包 data.table,也只有在 Linux 中才有对应的 Python 版本。 有些软件没有 Windows 版本。...本来我们期望的是 Linux 中的 R 能带来更好的并行运算效率,但是虚拟机不光吃掉了 Linux 带来的效率优势,性能更可能还不如在 Windows 版本。 虚拟机访问宿主系统资源比较麻烦。...背后的原因在于,虚拟机对于宿主系统来说是个外来者,因此虚拟机中的系统想要访问 Internet 或者宿主系统中的文件,就必须使用某种技巧“在宿主系统的防火墙中打一个洞”。...在微软商店下载 Linux 子系统 打开 Win10 的微软商店,搜索“Linux”,我们会发现微软已经为我们提供了众多的 Linux 发行版本。
new 关键字在虚拟机中是怎样的一个过程?JVM 构造对象的步骤都有哪些?...空闲列表 如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例...问题说明 对象创建在虚拟机中是非常频繁的行为,即使是仅仅修改一个指针所指向的位置,在并发情况下也并不是线程安全的,可能出现正在给对象 A 分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况...解决方案 对分配内存空间的动作进行同步处理,虚拟机采用CAS配上失败重试的方式保证更新操作的原子性。...把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java雄中预先分配一小块内存,称为本地线程分配缓冲TLAB(Thread Local Allocation Buffer)。
一直使用Mac OS,最近忽然想体验一下最新版本的Windows 11. 于是,去官网下载了Windows 11的安装映像文件,准备在VirtualBox上安装一台Win11的虚拟机。...但是进行了两次安装尝试之后,我发现安装进程一直提示我——当前电脑不满足安装Windows 11 的条件要求,这令我异常迷惑。...无奈只得到微软官网查找Windows 11的安装要求,结果发现了如下信息: 首先,安装Windows 11的电脑必须支持UEFI安全启动,其次还需要支持受信任的平台模块(TPM)2.0版本。...首先在VirtualBox当中创建一台新的虚拟机,系统类型选择如下: 注意:这里选择的版本是:Windows 10(64-bit) 2. 系统内存至少4GB; 3....2 在登录界面,点击登录选项。 3 在候选项中,选择离线帐户。 4 点击限制体验的选项进入新界面。 5 之后设置本地账户进行登录就行了。 END
异常情况 如果线程请求的栈深度大于虚拟机所允许的深度,就会抛出StackOverflowError异常 如果虚拟机可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机...此内存区域是唯一一个在Java虚拟机规范中没有任何OutOfMemortyError情况的区域。 ? 可以看到,程序计数器也是因为线程而产生的,与虚拟机栈配合完成计算操作。...Java虚拟机对Class文件每一部分(包括常量池)的格式都有严格规定,每一个字节用于存储那种数据都必须符合规范上要求才会被虚拟机认可、状态和执行,但是对于运行时常量池,Java虚拟机规范没有做任何细节的要求...元空间 在 Java 8 之前,类的信息是放在一个叫 Perm 区的内存里面的。更早版本,甚至 String.intern 相关的运行时常量池也放在这里。...总结 Java虚拟机栈是运行时数据区域,保存了局部变量表、操作数栈、动态链接、方法出口等信息,每个线程在运行时都会创建一个栈帧,通过程序计数器作为当前执行字节码的行号指示器,也就是指示当前程序执行到哪里了
概述 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。...《Java 虚拟机规范》中规定 Java 虚拟机管理的内存包括以下几个区域: ? 下面简要分析各个区域的特点。 2....JVM 运行时内存区域 2.1 程序计数器 程序计数器(Program Counter Register),可以看做当前线程所执行的字节码的行号指示器(其实就是记录代码执行到了哪里)。...主要作用:记录线程执行到了哪里。 2.2 Java 虚拟机栈 Java 虚拟机栈(Java Virtual Machine Stacks):Java 方法执行的线程内存模型。...2.7 直接内存 直接内存(Direct Memory)并非虚拟机运行时数据区的一部分,也非《Java 虚拟机规范》定义的内存区域。
在内存中创建一个代表该类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。 获取二进制字节流 对于 Class 文件,虚拟机没有指明要从哪里获取、怎样获取。...验证 验证的重要性 验证阶段确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。...验证的过程 文件格式验证 验证字节流是否符合 Class 文件格式的规范,并且能被当前版本的虚拟机处理,验证点如下: 是否以魔数 0XCAFEBABE 开头。...主次版本号是否在当前虚拟机处理范围内。 常量池是否有不被支持的常量类型。 指向常量的索引值是否指向了不存在的常量。 CONSTANT_Utf8_info 型的常量是否有不符合 UTF8 编码的数据。...… 元数据验证 对字节码描述信息进行语义分析,确保其符合 Java 语法规范。 字节码验证 本阶段是验证过程中最复杂的一个阶段,是对方法体进行语义分析,保证方法在运行时不会出现危害虚拟机的事件。
介绍下Java内存区域(运行时数据区) / 介绍下JVM内存模型 Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本有所不同。...在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候知道该线程上次运行到哪里。...StackOverFlowError:若Java虚拟机的内存大小不允许动态扩展,那当线程请求栈的深度超过当前Java虚拟机栈的最大深度的时候,就会抛出StackOverFlow。...在HotSpot虚拟机本地方法栈和Java虚拟机栈合二为一。 本地方法在执行的时候,在本地方法栈也会创建一个栈帧。用于存放本地方法的局部变量表、操作数栈、动态链接、出口信息(同虚拟机栈)。...尽管Java虚拟机规范将方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-heap,目的是与Java堆区区分开。
一、运行时数据区 1、内部结构 java虚拟机定了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动儿创建,随着虚拟机退出而销毁。...也是运行速度最快的存储区域 在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致 任何时间一个线程都只有一个方法再执行,也就是所谓的当前方法。...它是唯一一个在java虚拟机规范中没有规定任何OutOtMemoryError情况的区域 2、执行流程 我们首先写一个简单的代码 /**程序计数器 */ public class PCRegisterTest...,它其实就是指令地址,用于指向当前执行到哪里。...bipush有一个8bit的操作数,因此指令长度为2 3、为什么使用PC寄存器记录当前线程执行地址? 因为cpu需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪里开始继续执行。
介绍下Java内存区域(运行时数据区) / 介绍下JVM内存模型 Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本有所不同。...尽管Java虚拟机规范将方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-heap,目的是与Java堆区区分开。...在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候知道该线程上次运行到哪里。...StackOverFlowError:若Java虚拟机的内存大小不允许动态扩展,那当线程请求栈的深度超过当前Java虚拟机栈的最大深度的时候,就会抛出StackOverFlow。...在HotSpot虚拟机本地方法栈和Java虚拟机栈合二为一。 本地方法在执行的时候,在本地方法栈也会创建一个栈帧。用于存放本地方法的局部变量表、操作数栈、动态链接、出口信息(同虚拟机栈)。
class文件内的信息严格按照一定的格式(虚拟机规范中的格式),紧凑排列在class文件中的二进制流,中间无任何分隔符。...整个class文件很多很多的内容,用肉眼肯定是无法分辨的, ② class包含的内容 这个文件是有复杂格式,专门有JVM读里面的内容,方便阅读源码。 1.版本 源代码是由java的哪个版本的编译的。...① 方法区 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虚拟机规范中的一个逻辑区域(没有硬性的规定)。具体实现是根据不同的虚拟机来实现的。...③ 虚拟机栈 Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。一个方法对应一个栈帧。...计算,保存一些信息都是在栈里面。 ④ 本地方法栈 和java虚拟机栈类似,不同的是其为Native方法服务。它跟java虚拟机栈的区别就是执行的方法不同。
安装目录 java.vm.specification.version Java虚拟机规范版本 java.vm.specification.vendor Java虚拟机规范供应商 java.vm.specification.name...Java虚拟机规范名称 java.vm.version Java虚拟机实现版本 java.vm.vendor Java虚拟机实现供应商 java.vm.name Java虚拟机实现名称 java.specification.version...Java运行时环境规范版本 java.specification.vendor Java运行时环境规范供应商 java.specification.name Java运行时环境规范名称 java.class.version...要使用的 JIT 编译器的名称 java.ext.dirs 一个或多个扩展目录的路径 os.name 操作系统的名称 os.arch 操作系统的架构 os.version 操作系统的版本 file.separator...用户的账户名称 user.home 用户的主目录 user.dir 用户的当前工作目录
java虚拟机运行时数据区域 ---- 首先弄清几个概念: 1.方法区(method area)只是JVM规范中定义的一个概念,用于存储类信息、常量池、静态变量、JIT编译后的代码等数据,具体放在哪里...以前存储在永久代里面的数据现在存在了哪里? 元空间是一块与堆不相连的本地内存。...占有较小的内存空间 可以看作是当前所执行字节码的行号指示器 当线程执行java方法时,记录的是正在执行的vm字节码指令的地址。...方法区 前面已经介绍方法区在JDk8之后的的变动 JDK7及之前版本的方法区(Method Area)和Java堆一样,是各个线程共享的内存区域,用于存储已经被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据...虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但它有另外一个名字叫Non-Heap(非堆)。
那么就一定有人用刀背砍东西,有人用刀刃砍石头,而真正能正确使用的人它一定清楚这个物品哪里手可以握,哪里锋利,哪里可以砍树不能砍石头。...学习过程 在学习 Java 虚拟机的这个过程是及其枯燥的,18 年我看完了周老师的《深入理解 Java 虚拟机》(第二版),大概只用了 10 几个小时。...而且这次一起看了很多关于虚拟机的内容,包括 JSR 和 虚拟机规范,还有 R 大的一些博客。 ?...学习目标 系统的学习使我对 Java 虚拟机有了一定的理解,但究其深处还有很多可以探索的内容,其中执行引擎就是一个 “巨坑” ,不过这里并不是我们学习的目的,我们要学习的是我们写的代码在虚拟机里都干了什么...接下来的事 明确了学习的目标,再去学习就会相对清晰了很多,可以避开不是当前学习计划的内容,因为虚拟机的东西还是比较多。
程序计数器 程序计数器(Program Counter Register),可以看做当前线程所执行的字节码的行号指示器(其实就是记录代码执行到了哪里)。...主要作用:记录线程执行到了哪里。 2. Java 虚拟机栈 Java 虚拟机栈(Java Virtual Machine Stacks):Java 方法执行的线程内存模型。...唯一目的:存放对象实例(【几乎所有】的对象实例都在这里分配内存)。 《Java 虚拟机规范》描述:所有对象实例及数组都应在堆上分配。...特点: 线程共享 虚拟机启动时创建 PS: "新生代"、"老年代"、"Eden 区"等一系列对堆的区域划分,只是部分垃圾收集器的一些共性或设计风格,而非虚拟机的固有内存布局,更非《Java 虚拟机规范》...直接内存 直接内存(Direct Memory)并非虚拟机运行时数据区的一部分,也非《Java 虚拟机规范》定义的内存区域。
,此时线程让出 CPU 轮到其他线程执行,当再次轮到当前线程执行的时候,由于不知道上一次中断的位置,也就意味着不知道该从哪里开始接着执行了。...虚拟机栈栈顶的栈帧称之为当前栈帧,线程只会操作栈顶的栈帧(被操作的栈帧也称之为活动栈帧),对应的方法被称之为当前方法,每一个方法的执行开始到结束对应着一个栈帧在虚拟机栈中的入栈出栈操作。...虚拟机栈异常 Java 虚拟机规范规定了栈是有深度的,当栈深度超过了指定大小后会抛出 StackOverflowError。为什么 Java 虚拟机要规定栈的深度呢?...在虚拟机栈区域内,Java 虚拟机规范还规定了如果此区域的内存大小是动态可扩展的话,那么当内存不够使用的时候,虚拟机栈想要申请更多的内存来存储元素,但如果申请不到足够多的内存来存储变量的话,就会触发 OutOfMemoryError...Java 虚拟机规范规定当扩展到 -Xmx 时指定的容量时,还没有足够的内存去容纳新产生的对象时,就会触发 OutOfMemoryError 的异常。
领取专属 10元无门槛券
手把手带您无忧上云