jvm类加载及内存结构

本文详细介绍了Java虚拟机(JVM)的工作原理,包括内存结构、类加载过程、双亲委派机制以及对象实例化的过程。JVM内存包括类装载器、方法区、虚拟机栈、本地方法栈、堆和程序计数器等组成部分,各部分在执行Java程序时发挥关键作用。类加载分为加载、链接和初始化三个阶段,遵循双亲委派机制。此外,还探讨了对象实例化时的步骤,包括类初始化、内存分配和构造函数的执行。
摘要由CSDN通过智能技术生成

什么是jvm

jvm就是java虚拟机,java程序是运行在java虚拟机上的,通过java虚拟机来对操作系统进行操作,操作系统再操作硬件资源。

jvm的内存结构图

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210619080319482.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2NjcwNzU3,size_16,color_FFFFFF,t_70

class文件:

每一个类对应一个class文件,包含类的字段,方法,接口等信息;还有一个class常量池,存放的的是一些字面量(字面量就是一些文本字符串或者被final修饰的常量以及基本数据类型的值)和符号引用。

方法区:

方法区通常包含Class对象,也就是说从class文件加载过来的一些信息生成的一个Class对象(包括类的信息,静态变量等);class文件中的class常量池被加载到jvm内存的方法区之后就变化了一个动态常量池(运行时常量池),它也包含字面量和一些符号引用,比如String s=“aaa”,那么“aaa“就是一个字面量,再定义String s2=“aaa”,它使用的还是同一个字面量,而如果是使用new关键字的话就创建了两个不同的符号引用,指向两个不同的对象。

虚拟机栈和本地方法栈

虚拟机栈看名字就知道是一个栈嘛,每调用一个方法就创建方法对应的一个栈帧,栈帧弹出表示该方法结束,每个栈帧中可以存储对应方法用到的局部变量,操作数,动态链接,返回值等,本地方法栈与java虚拟机栈差不多是一样的,只不过它是为本地方法服务的。

堆存放的是对象的实例,包括实例变量,非静态方法等

程序计数器:

字节码的行号指示器,存储下一条执行的指令等信息。

各种变量存储的区域

在这里插入图片描述

类是如何加载的

分为主要的3大步:加载,链接,初始化
首先编译java源文件得到class字节码文件(二进制文件)并存储到本地;
①加载:当预料到某个类需要使用的时候就从本地内存读取.class文件到java虚拟机的方法区中生成Class对象(也就是一个类的模板),如果该类的父类还没加载会先加载它的父类;
②链接:链接分为验证,准备,解析三个步骤:
验证:检查类是否正确地加载以及检查程序是否对虚拟机有破坏性等;
准备:为类的静态变量分配内存,并赋默认值,(如果执行static int id=1,那么到这一步id的值还没有赋1,只是赋予它默认值0),但是如果在被static修饰的同时还被final修饰,那么会直接赋值为1,即直接将该变量放到类的常量池中;
解析:将符号引用转化为直接引用,简单地理解就是执行字节码指令,找到这个符号代表的真实地址;
③初始化:为静态变量赋真正的值,执行静态代码块;

类加载器

①bootStrap类加载器也叫根加载器
②extend类加载器:扩展加载器
③app类加载器:应用加载器
④自定义加载器
在这里插入图片描述

双亲委派机制

在类加载的过程中,下层收到加载请求时首先交给他的上层处理,上层再继续给上层,直到顶层根加载器,根加载器加载它能所加载的部分,不能加载的再一层一层往下加载。

类的实例化

注意区分类的初始化和实例化,初始化是为静态变量赋值,而实例化是得到一个实例对象;
当执行对象实例化的代码:
①判断类是否加载并完成实例化;
②在堆中开辟内存空间;
③对实例化对象进行初始化;
④对构造函数进行初始化(如有父类先对父类惊醒初始化);
⑤初始化完成后将地址的值赋给引用对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值