jvm简介
创始人
2024-03-20 02:21:23
0

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加载器不到这个类,则往下委托,直到找到这个类。一个类可以被不同的类加载器加载。

双亲委派机制:

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...