JVM学习日志(六) JVM从加载到内存全过程

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: JVM从加载到内存全过程 简述

JVM从加载到内存全过程

文字流程

  1. java代码编写完成后,首先通过jdea/eclipse编译打包称为jar包/war包,其中封装的是.class字节码文件
  2. 接下来使用java-jar启动jvm虚拟机,开启jvm进程
  3. jvm虚拟机接下来使用类加载器来对字节码文件进行加载
    1. 通过双亲委派机制
    2. 优先通过系统类加载器,加载jdk/lib包下面的类
    3. 然后通过extClassLoader进行加载 /ext包下面的类
    4. 最后通过应用程序类加载器,appClassLoader进行加载
    5. 同时类加载器加载类的时候,还涉及到一个破坏型双亲委派机制,通过上下文类加载器来破坏双亲委派机制,叫做上下文类加载器(ContextClassLoader),这种加载机制可以直接强制调用应用程序层加载器,java中涉及到SPI加载的框架基本都使用到了ThreadContextClassLoader
  4. jvm通过类加载器将class文件加载到jvm内存中,需要经历如下几个步骤
    1. 加载,验证,准备,解析,初始化等步骤
    2. 加载步骤:主要是通过类加载器打通jvm内存区域与.class文件的通道
    3. 验证:验证有很多验证方面,主要作用是验证.class文件格式是否符合规范,最简单的有一个魔数验证,及所有的.class文件的二进制文件开头都是CA FE BA BE这八个魔数
    4. 准备:在这一步主要是将.class文件加载到方法区的元空间中,并创建一个.class对象模板,在加载完成之后,在堆内存中创建.class字节码对象,并且给该对象的属性开辟空间以及赋初始值,如果涉及到基本数据类型的常量的话,在这个阶段也会给常量赋值
    5. 解析:在这一步将对象这种的符号引用转换为直接引用
    6. 初始化:在这一步需要将字节码对象中的对象属性直接赋值
  5. 当.class文件加载到内存中后,通过字节码执行引擎来执行相关的代码,字节码执行引擎会将jvm指令翻译成机器码,这里面涉及到解释器和即时编译器两大组件,解释器分为字节码解释器和模板解释器两种
    1. 字节码解释器是逐行进行编译解释,模板解释器是先将整个模板进行编译,然后再执行,前者编译很快,但是整体执行效率比较低,后者编译时间很慢,但是,编译后执行速度很快
    2. 即时编译器一般是和模板解释器配合使用,对热点代码进行跟踪标记,然后将热点代码编译成为模板代码,然后交由模板解释器进行解释执行
  6. 执行时可能会划分多个线程,每个线程都会有一个程序计数器用来标记和记录当前线程执行的指令位置,方便下次继续执行
  7. 每个线程都会有一个对应的虚拟机栈,用来存储当前系统执行的整体流程,每个方法都会以栈帧的形式来存放入虚拟机栈中,而方法中的局部变量都会存放再栈帧中,此时还有一个共享的栈空间叫做本地方法栈,本地方法栈中存储了一些native修饰的C++本地方法,用来直接跟操作系统进行交互
  8. 虚拟机栈的栈帧中的局部变量只是一个地址值,这个地址值指向的是堆内存中的一个对象地址
  9. 堆空间中分为这几块区域:新生代,老年代,新生代中又包含eden,suvivor0,suvivor1,垃圾处理器GC,youngGC,FullGC
  10. youngGC的触发时机是当新生代的eden区内存满了,放不下新对象的时候,这时候会将没有引用指向的对象清除,然后,将幸存下来的对象存放入suvivor区,并且进行年龄标记,当新生带位置放不下的情况下,会直接将该对象放入到老年代,老年代放不下的时候会直接触发fullGC,FullGC其实也叫Stop All The World,会将整个程序停止,然后进行清除
  11. 再1.8之前方法区中的字符串常量池是存放再老年代中,只有fullGC才会触发清除机制,1.8之后,将字符串常量池存放再新生代eden区中,通过minorGC和youngGC来进行清除

流程图

image-20230423172921088.png

image-20230423173026434.png

image-20230423173103342.png

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7天前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
20 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
2月前
|
存储 算法 Java
JVM自动内存管理之垃圾收集算法
文章概述了JVM内存管理和垃圾收集的基本概念,提供一个关于JVM内存管理和垃圾收集的基础理解框架。
JVM自动内存管理之垃圾收集算法
|
2月前
|
存储 Java 程序员
JVM自动内存管理之运行时内存区
这篇文章详细解释了JVM运行时数据区的各个组成部分及其作用,有助于理解Java程序运行时的内存布局和管理机制。
JVM自动内存管理之运行时内存区
|
2月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
3月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
|
3月前
|
算法 安全 Java
(七)JVM成神路之GC分代篇:分代GC器、CMS收集器及YoungGC、FullGC日志剖析
在《GC基础篇》中曾谈到过分代以及分区回收的概念,但基础篇更多的是建立在GC的一些算法理论上进行高谈阔论,而本篇则重点会对于分代收集器的实现进行全面详解,其中会涵盖串行收集器、并行收集器、三色标记、SATB算法、GC执行过程、并发标记、CMS收集器等知识,本篇则偏重于分析GC机制的落地实现,也就是垃圾收集器(Garbage Collector)。
|
3月前
|
Java Serverless 应用服务中间件
函数计算操作报错合集之JVM启动时找不到指定的日志目录,该如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
2月前
|
算法 Java
JVM自动内存管理之垃圾收集器
这篇文章是关于Java虚拟机(JVM)自动内存管理中的垃圾收集器的详细介绍。
|
3月前
|
存储 算法 Java
(四)JVM成神路之深入理解虚拟机运行时数据区与内存溢出、内存泄露剖析
前面的文章中重点是对于JVM的子系统进行分析,在之前已经详细的阐述了虚拟机的类加载子系统以及执行引擎子系统,而本篇则准备对于JVM运行时的内存区域以及JVM运行时的内存溢出与内存泄露问题进行全面剖析。
|
2月前
|
Java Docker 索引
记录一次索引未建立、继而引发一系列的问题、包含索引创建失败、虚拟机中JVM虚拟机内存满的情况
这篇文章记录了作者在分布式微服务项目中遇到的一系列问题,起因是商品服务检索接口测试失败,原因是Elasticsearch索引未找到。文章详细描述了解决过程中遇到的几个关键问题:分词器的安装、Elasticsearch内存溢出的处理,以及最终成功创建`gulimall_product`索引的步骤。作者还分享了使用Postman测试接口的经历,并强调了问题解决过程中遇到的挑战和所花费的时间。
下一篇
无影云桌面