如何啃下JVM这座大山,完结撒花!(一)

简介: JVM的学习轨迹,可以先通过该文章学习,然后对照《深入理解Java虚拟机》书籍把重点知识过一遍,最后最好能实战一下

JVM的学习轨迹,可以先通过该文章学习,然后对照《深入理解Java虚拟机》书籍把重点知识过一遍,最后最好能实战一下,下面是文章目录:

FH%ID)}{$SZG7QO%0}Y5)H8.png


类的加载过程


加载过程介绍

如果 JVM 想要执行这个 .class 文件,我们需要将其装进一个类加载器 中,它就像一个搬运工一样,会把所有的 .class 文件全部搬进JVM里面来。

R3R%[IEGQESV@(N)`6BEC`3.png

重点知识:

  • Java文件经过编译后变成 .class 字节码文件
  • 字节码文件通过类加载器被搬运到 JVM 虚拟机中
  • 虚拟机主要的5大块:方法区,堆都为线程共享区域,有线程安全问题,栈和本地方法栈和计数器都是独享区域,不存在线程安全问题,而 JVM 的调优主要就是围绕堆,栈两大块进行。

)2TLQ0CG4Y5APVYBHG(NY7O.png


类加载流程

类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。

image.gifV5KXYNZE21UX]L{[A22_SK5.png

  • 加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象
  • 连接,连接又包含三块内容:验证、准备、初始化。1)验证,文件格式、元数据、字节码、符号引用验证;2)准备,为类的静态变量分配内存,并将其初始化为默认值;3)解析,把类中的符号引用转换为直接引用
  • 初始化,为类的静态变量赋予正确的初始值
  • 使用,new出对象程序中使用
  • 卸载,执行垃圾回收


类加载器

加载一个Class类的顺序也是有优先级的,类加载器从最底层开始往上的顺序是这样的:

  • BootStrap ClassLoader:rt.jar
  • Extention ClassLoader: 加载扩展的jar包
  • App ClassLoader:指定的classpath下面的jar包
  • Custom ClassLoader:自定义的类加载器

$121RDM54@0S`MZ%E%JFB`V.png


垃圾回收


如何确定对象已死

通常,判断一个对象是否被销毁有两种方法:

  • 引用计数算法:为对象添加一个引用计数器,每当对象在一个地方被引用,则该计数器加1;每当对象引用失效时,计数器减1。但计数器为0的时候,就表白该对象没有被引用。
  • 可达性分析算法:通过一系列被称之为“GC Roots”的根节点开始,沿着引用链进U4[2O[~VSXG1S62VNN8IZH2.png行搜索,凡是在引用链上的对象都不会被回收。

image.gif

就像上图的那样,绿色部分的对象都在GC Roots的引用链上,就不会被垃圾回收器回收,灰色部分的对象没有在引用链上,自然就被判定为可回收对象。


垃圾回收算法

标记--清除算法

见名知义,标记--清除算法就是对无效的对象进行标记,然后清除。

image.gif8BPNM`{UJEV(ZQ${Q]{TF[0.png

复制算法

标记--复制算法就是把Java堆分成两块,每次垃圾回收时只使用其中一块,然后把存活的对象全部移动到另一块区域。

P~7GZ1H4RG3J@}[1)M4Z}V8.png

标记--整理算法

标记--整理算法算是一种折中的垃圾收集算法,在对象标记的过程,和前面两个执行的是一样步骤。但是,进行标记之后,存活的对象会移动到堆的一端,然后直接清理存活对象以外的区域就可以了。这样,既避免了内存碎片,也不存在堆空间浪费的说法了。但是,每次进行垃圾回收的时候,都要暂停所有的用户线程,特别是对老年代的对象回收,则需要更长的回收时间,这对用户体验是非常不好的。

6[P04C}8D}85}02U]1{L7RN.png

垃圾收集器

Serial收集器

Serial收集器是最基础、历史最悠久的收集器,是一个单线程工作的收集器,使用 Serial收集器,无论是进行 Minor gc 还是 Full GC ,清理堆空间时,所有的应用线程都会被暂停。

image.gif_E2ENF0@X)2US(]4NH0ZPMC.png

ParNew收集器

ParNew 收集器实质上是 Serial 收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之外,其余的行为包括 Serial 收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与 Serial 收集器完全一致。

image.gif[_{W_1Z0Y9WFDO3~5][9F83.png

Parallel Scavenge收集器

Parallel Scavenge收集器也是一款新生代收集器,基于标记——复制算法实现,能够并行收集的多线程收集器和 ParNew 非常相似。

Parallel Scavenge 收集器的目标则是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值。如果虚拟机完成某个任务,用户代码加上垃圾收集总共耗费了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

_E2ENF0@X)2US(]4NH0ZPMC.png

Serial Old收集器

Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法。

image.gifG8E21GZ4[SP}Z)(N2%PK${N.png

Parallel Old收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现。

image.gif@MEJUNL}UL~H[GA@7`OG[FL.png

CMS收集器

CMS 收集器设计的初衷是为了消除 Parallel 收集器和 Serial 收集器 Full gc 周期中的长时间停顿。CMS收集器在 Minor gc 时会暂停所有的应用线程,并以多线程的方式进行垃圾回收。

L{XBLOCQZJ$YL40)BJW]3MQ.png

垃圾收集器对比

~2(@2QE0`67K2NXUDFH5LLE.png

相关文章
|
存储 前端开发 安全
JVM学习笔记(完结)
JVM学习笔记(完结)
|
前端开发 Java 测试技术
如何啃下JVM这座大山,完结撒花!(三)
JVM的学习轨迹,可以先通过该文章学习,然后对照《深入理解Java虚拟机》书籍把重点知识过一遍,最后最好能实战一下
120 1
|
存储 运维 监控
如何啃下JVM这座大山,完结撒花!(二)
JVM的学习轨迹,可以先通过该文章学习,然后对照《深入理解Java虚拟机》书籍把重点知识过一遍,最后最好能实战一下
156 0
如何啃下JVM这座大山,完结撒花!(二)
|
23天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
184 1
|
2月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
40 4
|
12天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
21天前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
22天前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
19 3
|
23天前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
44 1
|
1月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。