
JVM虚拟机
文章平均质量分 96
字节码文件详解、运行时数据区(堆、栈、方法区、本地方法栈、程序计数器)、执行引擎、垃圾算法、七大垃圾收集器、常用调优案列详解
所得皆惊喜
很高兴认识大家,我是蓝帽子先生,优快云博客专家,Java领域优质创作者,阿里云社区受邀专家博主,目前从事某药物公司,负责小程序、app 服务端开发,跟随前辈熟悉商城逻辑代码中。热爱开源、热爱学习、目前Spring源码和MYSQL系统学习中。2025年,期待一起学习、一起进步!
展开
-
JVM_虚拟机目录
<font color="red">在人生的道路上,即使一切都失去了,只要一息尚存,你就没有丝毫理由绝望。因为失去的一切,又可能在新的层次上复得</font>[JVM00_面试官对类加载器子系统、运行时数据区、内存分布、执行引擎 你能坚持到第几问?](https://blog.youkuaiyun.com/TZ845195485/article/details/117573479)[JVM01_概述、跨平台原理、分类、三大商业虚拟机](https://blog.youkuaiyun.com/TZ845195485/articl原创 2019-06-28 11:44:22 · 41255 阅读 · 58 评论 -
JVM01_概述、跨平台原理、分类、三大商业虚拟机
前言:判断对象存活的两种方式(引用计数算法、枚举根节点做可达性分析)①. 引用计数法①. 原理:假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的计数器的值为0,就说明对象A没有引用了,可以被回收②. 最大的缺陷:无法解决循环引用的问题,gc永远都清除不了(这也是引用计数法被淘汰的原因)③. 代码展示:/** * -XX:+PrintGCDetails * 证明:java使用的不是引用计数算法 */.原创 2020-08-18 11:11:05 · 5897 阅读 · 2 评论 -
JVM02_类加载器子系统(生命周期、加载、链接、初始化、类加载器概述、分类、ClassLoader源码分析、双亲委派机制)
①. System.gc()的理解①. 在默认情况下,通过System.gc( )或者Runtime . getRuntime( ).gc( )的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。②. 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(无法保证马上触发GC)。[不保证一定会发生垃圾收集,只是给jvm发出提示]③. JVM实现者可以通过system.gc( )调用来决定JVM的GC行为。而一般情况下,垃圾回收原创 2020-08-18 16:42:25 · 5440 阅读 · 0 评论 -
JVM03_程序计数器的作用、特点、线程私有、本地方法的概述
①. 类的加载(掌握)①. 简述类的加载过程(掌握)当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载、类的链接、类的初始化这三个步骤来对类进行初始化。 如果不出现意外,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者初始化②. 什么是类的加载(Loading)类的加载指的是将类的.class文件中的二进制数据读取到内存中,存放在运行时数据区的方法区中,并创建一个大的Java.lang.Class对象,用来封装方法区内的数据结构③. 链接(Li原创 2020-08-19 11:05:31 · 4052 阅读 · 0 评论 -
JVM04_虚拟机栈概述、局部变量表、操作数栈、动态链接、方法的返回地址、附加信息
①. 程序计数器①. 作用,是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令②. 特点:①. 是线程私有的 ②. 不会存在内存溢出③. 注意:在物理上实现程序计数器是在寄存器实现的,整个cpu中最快的一个执行单元④. 它是唯一一个在java虚拟机规范中没有OOM的区域解释:⑤. 使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?⑥. PC寄存器为什么设定为线程私有?(为了能够准确原创 2020-08-19 11:15:04 · 3917 阅读 · 5 评论 -
JVM05_堆的概述、内存结构、复制算法、Minor|Major|Full GC、私有区域TLAB、对象分配、参数总结、逃逸分析、栈上分配、锁消除、标量替换
前言:(栈并不是越大越好,越多可以防止出现StackOverflowError晚点出现,但是栈越大,也就代表着虚拟机栈是一定的,你的栈越大,别的栈就会小)①. 什么是 Java virtual machine?①. 栈的概述每创建一个线程就会创建一个Java栈,每一个Java栈中都会有很多栈帧(局部变量表 | 操作数栈 | 动态链接 | 方法返回地址 | 一些附加信息) 掌握解释:(1). 虚拟机栈(Java Virtual Machine Stacks)和线程是紧密联系的,每创建一.原创 2020-08-19 11:20:45 · 3524 阅读 · 0 评论 -
JVM06_方法区的概述、内部结构、演变、常量池、运行时常量池、垃圾回收
①. 什么是JVM?1.什么是JVM?①. JVM 是 java虚拟机,是用来执行java字节码(二进制的形式)的虚拟计算机②. jvm是运行在操作系统之上的,与硬件没有任何关系②. Java的跨平台及原理2.Java的跨平台及原理①. 跨平台:由Java编写的程序可以在不同的操作系统上运行:一次编写,多处运行②. 原理:编译之后的字节码文件和平台无关,需要在不同的操作系统上安装一个对应版本的虚拟机(JVM)③. JVM的分类3.JVM的分类①. 类加载子系统原创 2020-08-19 11:27:54 · 4812 阅读 · 6 评论 -
JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存
①. 堆的概述1>. 堆的概述(共享|垃圾回收)①. 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域②. Java堆区在JVM启动的时候即被创建,其空间大小也是确定的。是Jvm管理最大的一块内存空间③. 堆可以在物理上不连续的内存空间中,但在逻辑上是连续的④. 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)⑤. 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的原创 2020-08-19 14:28:22 · 2304 阅读 · 4 评论 -
JVM08_字符串常量池基本特性、内存分配、拼接操作、intern、StringTable垃圾回收
①. 方法区的概述1>. 方法区的概述①. 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间和Java堆区一样都可以是不连续的 | 关闭Jvm就会释放这个区域的内存②. 方法区时逻辑上是堆的一个组成部分,但是在不同虚拟机里头实现是不一样的,最典型的就是永久代(PermGen space)和元空间(Metaspace)(注意:方法区时一种规范,而永久代和元空间是它的一种实现方式)③. 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同原创 2020-08-21 10:37:06 · 2009 阅读 · 4 评论 -
JVM09_执行引擎概述、机器码|指令|汇编语言、解释器、Jlt编译器及分类、AOT编译器
前言:(1).new 最常见的方式 | 变形1 : Xxx的静态方法 | 变形2 : XxBuilder/XxoxFactory的静态方法(2).Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public(3).Constructor的newInstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求(4).使用clone() :不调用任何构造器,当前类需要实现Cloneable接口,实现clone()(5).使用反序列化:从文件中、从.原创 2020-08-25 09:36:53 · 1809 阅读 · 1 评论 -
JVM10_引用计数法、GCROOT、Finalization机制、复制、标记清除、标记压缩算法、分代收集、增量收集、分区算法
引用计数法、GCROOT、Finalization机制、复制、标记清除、标记压缩算法、分代收集、增量收集、分区算法原创 2020-08-31 10:15:56 · 2755 阅读 · 1 评论 -
JVM11_System.gc、内存溢出、内存泄漏、STW、安全点、安全区域、强软弱虚引用
System.gc、内存溢出、内存泄漏、STW、安全点、安全区域、强软弱虚引用原创 2020-09-07 09:48:56 · 2229 阅读 · 2 评论 -
JVM12_评估GC性能指标、垃圾收集器概述、Serial、SerialOld、ParNew、Parallel、ParallelOld
面试遇到面试官问这部分可以这样回答:不同的厂商会考虑使用不同的JVM,不同的JVM会使用不同的垃圾收集器,下面我介绍下主流的垃圾收集器有哪些(主流的7种),下面你就可以展开去说明七种垃圾收集器的每一个细节。(1).截止JDK 1.8,一共有7款不同的垃圾收集器。每一款不同的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器(2).不同厂商、不同版本的虚拟机实现差别很大。HotSpot 虚拟机在JDK7/8后所有收集器及组合(连线),如下图:①. 评估GC的性能指.原创 2020-09-26 11:21:56 · 2351 阅读 · 1 评论 -
JVM13_字节码文件的跨平台、前端编译器、什么是字节码指令
①. 概述1>.概述(了解)①. 字节码文件的跨平台性(了解)①. Java语言:跨平台的语言当Java源代码成功编译为字节码后,如果想在不同的平台上运行,则无须再次编译这个优势不再那么吸引人了。Python PHP perl ruby lisp等有强大的解释器跨平台似乎已经快成为一门语言必须的特征②. Java虚拟机:跨语言的平台:(Java虚拟机不和包括java在内的任何语言绑定,它只与class文件这种二进制文件格式所关联。无论使用何种语言进行软件开发,只要将源文件编译原创 2020-10-04 10:39:43 · 1915 阅读 · 2 评论 -
JVM14_Class文件结构细节、魔数、Class文件版本、常量池、访问标识(或标志)、类索引|父类索引|接口索引集合、字段|方法|属性表集合
文章目录①. class文件结构细节概述②. class文件的魔数是什么③. 如何确保高版本的JVM可执行低版本的class文件?④. 常量池(class文件的基石)①. 什么是常量池?②. 常量池计数器③. 常量池表④. 字面量和符号引用①. class文件结构细节概述①. Class文件的结构并不是一成不变的,随着Java虚拟机的不断发展,总是不可避免地会对Class文件结构做出一些调整,但是其基本结构和框架是非常稳定的②. Class 文件格式采用一种类似于 C语言结构体的方式进行数据存原创 2021-05-01 21:59:13 · 1273 阅读 · 0 评论 -
JVM15_类的加载、链接、初始化、卸载、主动使用、被动使用
文章目录①. 说说类加载分几步?②. 什么是类的加载(Loading)③. 链接(Linking)④. 初始化(Initialization)②. 类加载器的介绍①. 启动类加载器②. 扩展类加载器(Extension ClassLoader)③. 应用程序类加载器(系统类加载器)④. 用户自定义类加载器(了解)⑤. 双亲委派机制 (掌握)⑥. 沙箱安全机制 (掌握)⑦. 如何判断两个Class对象是否相同⑧. 主动使用和被动使用①. 说说类加载分几步?①. 按照Java虚拟机规范,从class文件原创 2021-05-04 19:04:41 · 3543 阅读 · 5 评论 -
JVM16_类的概述、分类、ClassLoader源码分析、自定义类的加载器、双亲委派机制、沙箱安全机制
文章目录①. 类的加载器②. 类的加载器分类与测试①. 类加载器的介绍②. 启动(引导)类加载器 Bootstrap③. 扩展类加载器 Extension④. 应用程序(系统)类加载器 AppClassLoader⑤. 用户自定义类加载器(了解)⑤. 双亲委派机制 (掌握)⑥. 沙箱安全机制 (掌握)⑦. 如何判断两个Class对象是否相同⑧. 主动使用和被动使用①. 类的加载器①. ClassLoader的作用ClassLoader是Java的核心组件,所有的Class都是由ClassLoad原创 2021-05-07 21:29:24 · 2040 阅读 · 4 评论 -
JVM17_Tomcat打破双亲委派机制、执行顺序、底层代码原理、Tomcat|JDBC破坏双亲委派机制带来的面试题
文章目录①. Tomcat类加载机制②. Tomcat执行顺序③. ClassLoader的创建④. ClassLoader加载过程⑤. Tomcat破坏双亲委派机制带来的面试题①. Tomcat类加载机制①. 可以看到,在原来的 JVM 的类加载机制上面,Tomcat 新增了几个类加载器,包括 3 个基础类加载器和每个 Web 应用的类加载器。3个基础类加载器在 conf/catalina.properties 中进行配置:common.loader="${catalina.base}/lib"原创 2021-05-29 23:08:44 · 1268 阅读 · 6 评论 -
JVM00_面试官对类加载器子系统、运行时数据区、内存分布、执行引擎的灵虚拷问,你能坚持到第几问?
因为热爱所以坚持,因为热爱所以等待。熬过漫长无戏可演的日子,终于换来了人生的春天。他逐渐被人熟知,被人喜爱三年前,在苏州园区被面试官开口就是JVM问懵,根据知识点反复总结的面试问题 待更新全网JVM最详知识大全文章目录①. JDK中包含了哪些内容?②. 三大商业虚拟机③. 谈谈你对JVM整体的理解④. 简述Java类加载机制(Java类加载过程)⑤. 什么是类的加载、链接、初始化⑥. 类的主动使用和被动使用⑦. forName("Java.lang.String")和loadClass("Java.l原创 2021-06-04 21:59:51 · 11229 阅读 · 24 评论 -
JVM18_CMS低延迟垃圾收集器、概述、原理、优缺点、参数设置、三色标记、ASTB 和 Incremental Update、记忆集与卡表
文章目录①. CMS概述②. CMS过程(原理)③. CMS优缺点④. CMS参数设置⑤. CMS三色标记概述、问题、解决方案⑥. 原始快照SATB 和 增量更新Incremental Update⑦. 记忆集与卡表①. CMS概述①. 在JDK1.5时期, HotSpot推出了一款在强交互应用中几乎可认为有划时代意义的垃圾收集器: CMS (Concurrent 一Mark 一 Sweep)收集器,这款收集器是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线原创 2021-06-22 11:19:35 · 1843 阅读 · 6 评论 -
JVM19_G1垃圾收集器概述、特点、常用参数、Region详解、记忆集与写屏障、年轻代GC、并发标记过程、Mixed GC、Full GC
文章目录①. 什么是G1垃圾收集器②. 为什么名字叫Garbage First③. G1垃圾收集器的特点、缺点④. 参数设置⑤. 调优操作步骤⑥. Region详解⑦. 记忆集与写屏障⑧. G1回收器垃圾回收过程①. 年轻代GC②. 并发标记过程③. 混合回收 Mixed GC④. Full GC⑨. 优化建议①. 什么是G1垃圾收集器①. G1(Garbage-First)是一款面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足GC停顿时间的同时,还兼具高吞吐量的原创 2021-06-28 15:25:00 · 3164 阅读 · 4 评论