学习记录之JVM

一、JVM内存模型

主要分为程序计数器、虚拟机栈、本地方法栈、堆、方法区(元空间)

1、程序计数器

用于存放下一条指令的一小块内存空间(记录正在执行的字节码地址)

2、虚拟机栈

保存的是方法的栈帧数据。每个方法被执行的时候都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接方法、返回地址等数据。每个方法的执行过程就是入栈和出栈的过程。

3、本地方法栈

用于管理本地方法执行的空间

4、堆

存放大量对象和数组的空间。又可以分为新生代和老年代,新生代区用于存放刚创建的对象或者是年轻对象,老年代则是存放一直没有被回收的对象。

新生代又可被分为eden、from survivor、to survivor(比例 8:1:1),eden 存放的是刚刚创建的对象,from 和 to 存放的则是至少经历过一次回收且存活下来的对象,当幸存下来的对象达到指定年龄,则被移入老年代。

5、方法区

存放的是类的元数据,包含类的类型数据,域信息、运行时常量池、方法信息

二、JVM类加载机制

主要分为加载、验证、准备、解析、初始化。

1、加载

通过类的全限定名获取.class文件,将这个.class文件内的二进制数据读取出来,转化成方法区内运行时数据结构,在堆中生成一个能代表这个类的class对象,作为方法区这些数据的访问入口。

2、验证

验证class文件的字节码格式是否符合Java虚拟机规范。主要验证的有四点:文件格式验证、元数据验证、字节码验证、符号引用验证。

3、准备

为静态变量分配内存,并设置初始化值。

4、解析

将常量池中的符号引用转换为直接引用。

5、初始化

为类的静态变量赋予真正的数值,对类的变量进行初始化。

三、类加载器

1、启动类加载器

2、扩展类加载器

3、应用程序类加载器

4、双亲委派模式

一个类在收到类加载请求后不会自己尝试加载这个类,而是将这个加载请求委派给父类加载器去完成,其父类加载器又会将这个请求委派给自己爹父类加载器去完成,以此类推,这样所有的类加载都会委派给启动类加载器。当父类加载器无法加载时,则向下委派给自己的子类加载器,直到这个类被加载成功为止。若是找不到这个类,则报异常(ClassNotFoud)

相关推荐
B1nna11 分钟前
Docker学习
学习·docker·容器
ruan11451412 分钟前
MySQL4种隔离级别
java·开发语言·mysql
Hellyc4 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen4 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge5 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
百锦再5 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂6 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
promising-w6 小时前
【运算放大器专题】基础篇
嵌入式硬件·学习
宝山哥哥6 小时前
网络信息安全学习笔记1----------网络信息安全概述
网络·笔记·学习·安全·网络安全
前端开发与ui设计的老司机6 小时前
从UI设计到数字孪生实战:构建智慧教育的个性化学习平台
学习·ui