Java 虚拟机基本结构划分

Java 虚拟机基本结构

JVM被分为三个主要的子系统:类加载器子系统、运行时数据区和执行引擎

一、类加载器子系统

1、Bootstrap ClassLoader :称之为启动类加载器,是最顶层的类加载器,负责加载JDK中的核心类库,如 rt.jar、resources.jar、charsets.jar等。

2、Extension ClassLoader:称之为扩展类加载器,负责加载Java的扩展类库,默认加载$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目录下的jar包。

3、App ClassLoader:称之为系统类加载器,负责加载应用程序classpath目录下所有jar和class文件。
在这里插入图片描述

双亲委派机制

向上委派机制保证先加载JDK的核心类,再加载应用程序的类,有效防止了因为应用程序中因为某个类的存在一些不安全问题,导致JVM变得不安全。

向下委派机制保证需要加载的类,都得到了加载。

自定义类加载器

自定义类加载器实现热部署
监听类的修改时间,如果修改时间发生改变,就将其重新加载到虚拟机中
tomcat为什么要打破双亲委派机制
tomcat给每一个web应用创建一个WebApp ClassLoader,重写了loadClass方法,优先加载当前目录下的类
为了隔绝tomcat本身与web应用,CatalinaClassLoader加载tomcat本身
在这里插入图片描述

二、运行时数据区

堆(线程共享)

Java 堆是用来存放对象实例及数组
永久代的回收效率很低,在 Full GC 的时候才会执行永久代的垃圾回收,所以jdk8字符串常量池移入了堆中,字符串常量池是哈希表结构,最小大小为1009

在这里插入图片描述

方法区

用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。

虚拟机栈(线程私有)

每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用,是线程私有的。生命周期和线程一致,作用:主管Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。

本地方法栈

java通过JNI直接调用本地C/C++

程序计数器(线程私有)

程序计数器在物理上叫寄存器,寄存器是用来存储指向下一条指令的地址,也就是即将将要执行的指令代码。由执行引擎读取下一条指令。
Java中虚拟机指令拿到一条指令,交给解释器,解释器把他翻译成机器码,机器码才能交给CPU来运行

三、执行引擎

将加载到内存中的字节码(不是直接运行的机器码), 解释/编译为不同平台的机器码.

待续。。。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值