JVM体系结构概述

时间:2022-11-13 05:41:32

ClassLoader(类装载器)

负责加载class文件。

class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。

JVM体系结构概述

虚拟机自带的加载器

  • 启动类加载器(Bootstrap)
  • 扩展类加载器(Extension)
  • 应用程序类加载器(AppClassLoader)也称系统类加载器。 加载当前应用的classpath下的所有类。

用户自定义加载器

Java.lang.ClassLoader的子类,用户可以定制类的加载方式。

JVM体系结构概述

sun.misc.Launcher它是一个java虚拟机的入口应用。

Execution Engine(执行引擎)

负责解释命令,提交操作系统执行。

Native Interface(本地接口)

作用是融合不同的编程语言为Java所用。它的初衷是融合C/C++程序。

Java诞生的时候是C/C++横行的时候,要想立足,必须有调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码。 它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies。

目前该方法使用的越来越少了,除非是与硬件有关的应用。 比如,通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见。 因为,现在的异构领域间的通信很发达。 比如,可使用Socket通信,也可使用Web Service等等,不多做介绍。

Native Method Stack(本地方法栈)

它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载本地方法库。

Program Counter Register(程序计数器)

也叫PC寄存器。每个线程都有一个程序计数器,是线程私有的。就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可忽略不记。

这块内存区域很小,它是当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。

如果执行的是一个native方法,那这个计数器是空的。

Method Area(方法区)

方法区是被所有线程共享。所有字段和方法字节码,以及一些特殊方法,如构造器,接口代码也在此定义。

简单说,所有定义的方法的信息都保存在该区域,此区属于共享区间。 静态变量、常量、类信息(构造器/接口定义)、运行时常量池存在方法区中。

但,实例变量存在堆内存中,和方法区无关。

Stack 栈

栈也叫栈内存,主管Java程序的运行,是在线程创建时创建。

它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束,该栈就Over,生命周期和线程一致,是线程私有的。

8种基本类型的变量、对象的引用变量、实例方法都是在函数的栈内存中分配的。

栈存储什么

  • 本地变量(Local Variables):输入参数和输出参数以及方法内的变量。
  • 栈操作(Operand Stack):记录出栈、入栈的操作。
  • 栈帧数据(Frame Data):包括类文件、方法等等。

栈运行原理

栈中的数据都是以栈帧(Stack Frame)的格式存在。 栈帧是一个内存区块,是一个数据集,是一个有关方法和运行期数据的数据集。

当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中。 A方法又调用了B方法,于是产生栈帧F2也被压入栈, B方法又调用了C方法,于是产生栈帧F3也被压入栈, …… 执行完毕后,先弹出F3栈帧,再弹出F2栈帧,再弹出F1栈帧……

遵循“先进后出”/“后进先出”原则。(联想下【装子弹】)

每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

每个方法从调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。 栈的大小和具体JVM的实现有关,通常在256K~756K之间。

JVM体系结构概述

图示在一个栈中有两个栈帧: 栈帧2是最先被调用的方法,先入栈,然后方法2又调用了方法1,栈帧1处于栈顶的位置,栈帧2处于栈底,执行完毕后,依次弹出栈帧1和栈帧2,线程结束,栈释放。

每执行一个方法都会产生一个栈帧,保存到栈(后进先出)的顶部,顶部栈就是当前的方法,该方法执行完毕后会自动将此栈帧出栈。

JVM体系结构概述

栈、堆、方法区的交互关系

JVM体系结构概述

HotSpot是使用指针的方式来访问对象。 Java堆中存放访问类元数据的地址。 reference存放的是对象的地址。

三种JVM

  • S
    using System.Collections;
     2 using System.www.yongxinzaixian.cn Collections.Generic;
     3 using www.yongshiyule178.com UnityEngine;
     4 using UnityEngine.EventSystems;
     5
     6 public class ParentHandler : MonoBehaviour, IPointerClickHandler, IPointerDownHandler,www.yun-shengyl.com IPointerUpHandler
     7 {
     8     public void OnPointerClick(PointerEventData eventData)
     9     {
    10         Debug.Log("Parent OnPointerClick" + eventData.ToString());
    11     }
    12
    13     public www.qwert888.com/ void OnPointerDown(PointerEventData eventData)
    14     {
    15         Debug.Log("Parent OnPointerDown" + eventData.ToString());
    16     }
    17
    18     public void OnPointerUp(www.gouyiflb.cn/ PointerEventData eventData)
    19     {
    20         Debug.Log("Parent OnPointerUp" + eventData.ToString());
    21     }
    22 }
    JVM体系结构概述
    JVM体系结构概述
     1 using System.Collections;
     2 using System.Collections.Generic;
     3 using UnityEngine;
     4 using UnityEngine.EventSystems;
     5
     6 public class ChildHandler : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler
     7 {
     8     public void OnPointerClick(PointerEventData eventData)
     9     {
    10         Debug.www.bsyLptvip.com Log("Child OnPointerClick" + eventData.ToString());
    11     }
    12
    13     public void OnPointerDown(PointerEventData eventData)
    14     {
    15         Debug.Log("Child OnPointerDown" + eventData.ToString());
    16     }
    17
    18     public void OnPointerUp(PointerEventData eventData)
    19     {
    20         Debug.www.suoLaiervip.com Log("Child OnPointerUp" + eventData.ToString());
    21     }

    un公司的HotSpot

  • BEA公司的www.yunshenpt.com   JRockit
  • IBM公司的J9 www.shengyunyule.cn VM