• jvm简介


    01c7d58877c74b1396da9257b9a9fa9c.jpg.什么是JVM?

     

    JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运行,这也是Java能够“一次编译,到处运行的”原因。

     

    2.JRE、JDK和JVM的关系

    JRE(Java Runtime Environment, Java运行环境)是Java平台,所有的程序都要在JRE下才能够运行。包括JVM和Java核心类库和支持文件。

    JDK(Java Development Kit,Java开发工具包)是用来编译、调试Java程序的开发工具包。包括Java工具(javac/java/jdb等)和Java基础的类库(java API)

    JVM(Java Virtual Machine, Java虚拟机)是JRE的一部分。JVM主要工作是解释自己的指令集(即字节码)并映射到本地的CPU指令集和OS(操作系统)的系统调用。Java语言是跨平台运行的,不同的操作系统会有不同的JVM映射规则,使之与操作系统无关,完成跨平台性。

    3.java 体系结构介绍

     

    jvm体系总体分四大块:

    类的加载机制

    jvm内存结构

    GC算法 垃圾回收

    GC分析 命令调优

    ①jvm体系之-类的加载机制

    什么是类的加载?

    类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

    加载类的过程。

     

    (1)装载(loading)

     

    负责找到二进制字节码并加载至JVM中,JVM通过类名、类所在的包名、ClassLoader完成类的加载。

    因此,标识一个被加载了的类:类名 + 包名 + ClassLoader实例ID。

    (2)链接(linking)

     

    负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接口。

    链接又包含三块内容:验证、准备、初始化。

        1)验证,文件格式、元数据、字节码、符号引用验证;

        2)准备,为类的静态变量分配内存,并将其初始化为默认值;

        3)解析,把类中的符号引用转换为直接引用

    (3)初始化(initializing)

     

    负责执行类中的静态初始化代码、构造器代码以及静态属性的初始化,以下六种情况初始化过程会被触发。

        1. 创建类的实例,也就是new的方式

        2.访问某个类或接口的静态变量,或者对该静态变量赋值

        3.调用类的静态方法

        4.反射(如Class.forName(“com.shengsiyuan.Test”))

        5.初始化某个类的子类,则其父类也会被初始化

        6.Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类

    类加载器

    站在Java开发人员的角度来看,类加载器可以大致划分为以下三类:

    (1).启动类加载器:Bootstrap ClassLoader

     

    负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录,下同)下,

    或被-Xbootclasspath参数指定的路径中的

    并且能被虚拟机识别的类库(如rt.jar,所有的java.开头的类均被Bootstrap ClassLoader加载)。

    启动类加载器是无法被Java程序直接引用的。

    (2).扩展类加载器:Extension ClassLoader

     

    该加载器由sun.misc.Launcher$ExtClassLoader实现,

    它负责加载JDK\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.开头的类),

    开发者可以直接使用扩展类加载器。

    (3).应用程序类加载器:Application ClassLoader

     

    该类加载器由sun.misc.Launcher$AppClassLoader来实现,

    它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,

    如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

    应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,因此如果编写了自己的ClassLoader,便可以做到如下几点:

    1、在执行非置信代码之前,自动验证数字签名。

    2、动态地创建符合用户特定需要的定制化构建类。

    3、从特定的场所取得java class,例如数据库中和网络中。

     

    双亲委托模式当类加载器收到了类加载的请求

    当JVM加载一个类的时候,下层的加载器会将任务给上一层类加载器,上一层加载检查它的命名空间中是否已经加载这个类,如果已经加载,直接使用这个类。如果没有加载,继续往上委托直到顶部。检查之后,按照相反的顺序进行加载。如果Bootstrap加载器不到这个类,则往下委托,直到找到这个类。一个类可以被不同的类加载器加载。

    双亲委派机制:

  • 相关阅读:
    oracle数据库常见巡检脚本-系列一
    Vue.js 框架源码与进阶 - Vue.js 3.0 快速上手(尚硅谷)
    C语言判断闰年(ZZULIOJ1028: I love 闰年!)
    【美团3.18校招真题2】
    Ubuntu2004字体不清晰,排查流程
    c++——AVL树
    OpenCV dnn模块 分类模型Resnet50 OpenCV dnn模块部署 .onnx模型
    医学之肌肉的结构和功能
    【总结】深度学习阶段性总结
    IBM车库创新:为科技创新头号工程打造共创引擎
  • 原文地址:https://blog.csdn.net/weixin_57763462/article/details/128194772