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

简介: 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

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
10月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
919 55
|
11月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
882 6
|
5月前
|
存储 缓存 Java
我们来说一说 JVM 的内存模型
我是小假 期待与你的下一次相遇 ~
460 5
|
5月前
|
存储 缓存 算法
深入理解JVM《JVM内存区域详解 - 世界的基石》
Java代码从编译到执行需经javac编译为.class字节码,再由JVM加载运行。JVM内存分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)区域,其中堆是GC主战场,方法区在JDK 8+演变为使用本地内存的元空间,直接内存则用于提升NIO性能,但可能引发OOM。
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
2504 1
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1237 166
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
674 29
JVM简介—1.Java内存区域
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
11月前
|
调度
FreeRTOS学习日志 - 第一天
这就是我的FreeRTOS学习日志 - 第一天的内容,明天继续探索这片实时操作系统的广阔海洋。+
215 12
|
存储 算法 Java
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
208 6