美文网首页
Java-jvm学习

Java-jvm学习

作者: 没有了遇见 | 来源:发表于2024-02-19 09:03 被阅读0次

1:Jvm是什么

Jvm 虚拟机(Java Virtual Machine)字面意思,Java虚拟的机器 ,一种Java,用于计算机设备的规范.

介绍:

Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。

重点:

Jvm 是Java实现跨平台的基础,只要平台支持Jvm Java语言写的项目就能在此平台上运行.

2:Jvm结构

Jvm结构图.png

Jvm由 以下几个部分组成

  • 类加载器(.class类加载)
  • 运行时数据区(运行时数据存储,分为方法区,堆,java栈,本地方法栈,程序计数器)
  • 执行引擎本(执行字节码或者执行本地方法)
  • JNI(Java Native Interface)本地地方法接口
  • Native Library 本地方法库 C/C++实现的一些库

3:类加载器

类加载器:
类加载器是Jvm提供的一种类加载的机制. 类加载器负责将class文件加载到内存中,转化为可执行对象.所有类都是由类加载器加载的
类加载器还负责解析类的依赖关系,即加载所需的其他类。

类加载器分类
  • Bootstrap Class Loader 启动类加载器又称跟加载器
  • Extension Class Loader 扩展类加载器
  • Application Class Loader 程序类加载器
  • 自定义加载器(处理业务需要加密等特殊的加载器)
3.1 Bootstrap Class Loader启动类加载器

Bootstrap Class Loader 启动类加载器,又称跟加载器,是最顶层的加载器.是由C++实现,负责加载Java的核心类,%JAVA_HOME%/lib目录下的核心jar包和类或者或被 -Xbootclasspath参数指定的路径中的所有类,例如:java.lang.Object

3.2 ExtensionClassLoader 扩展类加载器:

主要负责加载目录 %JRE_HOME%/lib/ext 目录下的jar包和类,或被 java.ext.dirs 系统变量所指定的路径下的jar包。

3.2 AppClassLoader 应用程序类加载器:

面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。

除了这三个主要的类加载器,Java还支持自定义类加载器,开发人员可以根据需要实现自己的类加载器。
注意:
除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader

3.3 类生命周期

类生命周期.png

一个类的生命周期,就是类加载器加载到卸载一个类的过程.
类的生命周期可以分为以下几个阶段:

  • 加载(Loading)
    根据类的全限定名(包括包路径和类名)定位并读取类文件的字节码。
  • 验证(Verification)
    校验类是否符合jvm规范
  • 准备(Preparation)
    为静态变量赋予默认值,这些内存都将在方法区中分配
    注意:
    静态变量复制,0,null,""等
    final修饰的直接赋值而不是赋予默认值
  • 解析(Resolution)
    将常量池中的符号引用替换为直接引用(内存地址)的过程.
    符号引用就是一组符号来描述目标,可以是任何字面量。属于编译原理方面的概念如:包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。
    直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。如指向方法区某个类的一个指针
    个人理解就是将常量池中的对象,通过一个指针空间地址值对象化.
  • 初始化(Initialization)执行类的初始化代码,包括静态变量的赋值和静态块的执行
    为静态变量赋值

赋初值两种方式:
定义静态变量时指定初始值。如 private static String x="123";
在静态代码块里为静态变量赋值。如 static{ x="123"; }
注意:只有对类的主动使用才会导致类的初始化

  • 使用(Using) 被引用的时候就是在使用
  • 卸载(Unloading)
    执行了System.exit()方法, 程序正常执行结束
    程序在执行过程中遇到了异常或错误而异常终止
    由于操作系统出现错误而导致Java虚拟机进程终止
3.4 类加载机制-双重委派机制(爹来模式)(重要)

类加载器采用了双亲委派模型(Parent Delegation Model)来加载类。
即当一个类加载器需要加载类时,自身不会加载会首先发送给父类加载,父类要是还有父类就会依次向上传递,父类不能加载会返回给子类,子类加载,子类也加载不了会抛出ClassNotFoundException异常
好处:
确保类只加载一次

相关文章

  • Java、Python与PHP的虚拟机异同

    Java、Python与PHP的虚拟机异同 Java-JVM 定义 JDK(Java Development Ki...

  • java-JVM

    JVM第一章 1.原码、反码、补码怎么表示? 二进制的第一位为符号位,0为正数,1为负数原码:正数的原码符号位为0...

  • Java-JVM

    JVM(JavaVirtualMachine) 即Java虚拟机。它能够识别.class文件(javac编译后的的...

  • JVM常用操作

    java-jvm性能调优 1 jps 查看所有的jvm进程,包括进程ID,进程启动的路径等等。 2 jstack ...

  • java-jvm图

  • java-jvm垃圾回收

    java为什么要做垃圾回收 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它...

  • 【教3妹学java-JVM】8.双亲委派模型

    3妹:2哥,今天是星期天,走,请你下馆子吃大餐怎么样。2哥:哇哦,看来今天3妹很开心哈?3妹:是的,今天系统学习了...

  • 【教3妹学java-JVM】7.Java的内存模型是怎样的?

    3妹:“如果你突然打了个喷嚏那一定就是我在想你。如果半夜被手机吵醒啊那是因为我关心……”3妹正在一遍又一遍地唱着王...

  • 【教3妹学java-JVM】9.Java中对象的创建过程是怎么样

    2哥:3妹,昨天我们已经学习了Java的内存模型,那你知道一个对象的创建过程是怎样的吗?3妹:这个我知道,我可是个...

  • 学习学习学习

    第三天了,连续三天,早上睁眼开始,看视频,做课件,连续作业,直到晚上十二点才睡觉。吃饭不规律,想起来就吃,感觉不饿...

网友评论

      本文标题:Java-jvm学习

      本文链接:https://www.haomeiwen.com/subject/ybcmndtx.html