一图了解JVM体系结构

一、JVM 的主要组成部分
  1. 类加载器(ClassLoader)
  2. 运行时数据区(Runtime Data Area)
  3. 执行引擎(Execution Engine)
  4. 本地库接口(Native Interface)

各组件的作用:首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

二、运行时数据区

1)运行时数据区:经过编译生成的字节码文件(class文件),由class loader(类加载子系统)加载后交给执行引擎执行。在执行引擎执行的过程中产生的数据会存储在一块内存区域。这块内存区域就是运行时区域

2)程序计数器:用于记录当前线程的正在执行的字节码指令位置。由于虚拟机的多线程是切换线程并分配cpu执行时间的方式实现的,不同线程的执行位置都需要记录下来,因此程序计数器是线程私有的

3)虚拟机栈:虚拟机栈是java方法执行的内存结构,虚拟机会在每个java方法执行时创建一个“栈桢”,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。当方法执行完毕时,该栈桢会从虚拟机栈中出栈。其中局部变量表包含基本数据类型和对象引用;

在java虚拟机规范中,对这个区域规定了两种异常状态:如果线程请求的栈的深度大于虚拟机允许的深度,将抛出StackOverFlowError异常(栈溢出),如果虚拟机栈可以动态扩展(现在大部分java虚拟机都可以动态扩展,只不过java虚拟机规范中也允许固定长度的java虚拟机栈),如果扩展时无法申请到足够的内存空间,就会抛出OutOfmMemoryError异常(没有足够的内存)

4)本地方法栈:类似java方法的执行有虚拟机栈,本地方法的执行则对应有本地方法栈

5)方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。线程共享(看存储的数据就知道了)

三、GC算法(主流:G1,未来ZGC)

什么是方法区:方法区又可以称为永久区,通过static关键字修饰的基本上回都是存放在方法区里面,还可以存放一些常量信息,方法区是当class文件被加载的时候,就会被初始化。

堆:创建对象,new 出来的,数组都 放在堆内存当中,调优策略基本是调堆内存,堆里的所有线程会被共享。

栈:定义基本的局部变量,栈代码执行完毕,自动释放内存。栈里面每个线程都是私有的,互不共享,

Minor GC:操作的是年轻代

Major GC:操作的是老年代

Full GC:操作的是整个堆。(时间静止)

调优问题:web开发的时候,不要定义太多的常量,方法区里所有的线程都会被共享的,这样容易产生线程安全问题。

四、双亲委派机制

三种类型类加载器:

  • 启动(Bootstrap)类加载器
  • 标准扩展(Extension)类加载器
  • 系统(System)类加载器

除了以上列举的三种类加载器,还有一种比较特殊的类型 — 线程上下文类加载器。

双亲委派机制描述
某个特定的类加载器在接到加载类的请求时候,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

为什么要使用双亲委派模型

防止内存中出现多份同样的字节码

五、一图了解JVM的结构体系

JVM体系结构图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值