我是靠谱客的博主 称心彩虹,最近开发中收集的这篇文章主要介绍Java学习笔记之JVM(一)前言JVM是什么?JVM的结构认识类加载子系统(ClassLoader)问题思考,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

前言

JVM是什么?

JVM的结构

认识类加载子系统(ClassLoader)

 加载(Loading)

 链接(Linking)

 初始化(Initialization)

问题思考


前言

        工作这么多年经常听到JVM这个东西,然而却一直没有好好去理解。因此本次来好好解读一下JVM。由于JVM的内容比较多所以将分为四个章节记录。而本篇是Java虚拟机的开篇,主要是初步认识一下JVM。

JVM是什么?

        Java虚拟机(Java virtual machine),是用来执行字节码文件指令的虚拟机。它可以让Java编译出来的文件在不同的操作系统上运行,这也就是所谓的跨平台运行。

JVM的结构

那么Java虚拟机到底长啥样呢?它有哪些内容?我们通过一张图来初步看看Java虚拟的结构。

  1. ClassFiles:class文件
  2. 类加载子系统:用于加载class文件的子系统。
  3. 运行时数据区域:

         对象区域:存放对象结构的区域,比如常量池、成员变量、方法代码及方法数据。

         堆:运行时数据区域用于给对象分配空间。

         栈:Java存储栈框架;控制本地变量和部分结果,管理一部分方法的调用与返回。每创建一个线程都会开辟一个私有的虚拟栈空间

         本地方法栈:包含应用的所有本地方法。

         计数器:

     4. 执行引擎

        即时编译器:Just-In-time compiler。

        垃圾回收器:自动回收未引用的对象,核心模块,里面包含了垃圾回收器和垃圾回收算法。

     5. 本地方法接口:Java Native Interface(JNI)框架,提供调用其他语言(C/C++)实现的应用程序的接口。Java使用JNI实现与控制台及操作系统的交互功能。

     6. 本地方法库

认识类加载子系统(ClassLoader)

    首先看一下类加载子系统的生命周期,如下图:

   加载(Loading)

    工作原理是使用类加载器结合双亲委派机制将Class文件和Jar加载进来。

    类加载器有两种类型:

        1.JVM提供的bootstrap类加载器:

  • 系统应用类加载器(appClassLoader):主要加载当前应用的ClassPath
  • 推展类加载器(extClassLoader):主要加载%JAVA_HOME%/jre/lib/ext
  • 启动类、根类加载器(BooststrapClassLoader):主要加载%JAVA_HOME%/lib
public class ClassLoaderMain {

    public static void main(String[] args) {
        //自定义class
        DemoJvm demoJvm = new DemoJvm();
        //拓展目录class
        EncoderFactory factory = new EncoderFactory();
        //启动类class
        String string = new String("");
        //返回结果: sun.misc.Launcher$AppClassLoader
        System.out.println(demoJvm.getClass().getClassLoader().getClass().getName());
        //返回结果: sun.misc.Launcher$ExtClassLoader
        System.out.println(factory.getClass().getClassLoader().getClass().getName());
        //返回结果: null (根类加载器为null)
        System.out.println(string.getClass().getClassLoader());
    }
}

        2.用户自定义类加载器:用户自定义类加载器是一个继承了ClassLoader抽象类的对象。主要加载本地磁盘或网络的类。

     双亲委派机制

     双亲委派实质上就是上面所提及的4种类加载器在加载类之前不会立即由当前类加载器加载,而是先询问其上一层类加载器是否加载过对应类,若上层类加载器反馈当前类加载器没有加载过其需要加载的类,则当前类加载器才会向其所加载的目录寻找该类。 此过程是逐层往上询问的直至找到类否则返回ClassNotFoundException。通过以下流程可以了解双亲委派机制。

 链接(Linking)

        在加载阶段结束之后JVM就进入链接阶段。链接阶段其实是做了很多工作的,具体什么工作感兴趣的同学可以深究。此处简单说说几个主要工作。

        验证

        验证过程中JVM会检查class二进制文件是否符合JVM规范。

        准备

        准备阶段所作的工作是创建及初始化类或接口的静态变量。

        解析

        解析是从运行时常量池中的符号引用动态确定具体值的过程。比如类,字段及方法等解析(官方文档翻译,后续需重新理解)

 初始化(Initialization)

       初始化类或接口其中包括执行初始化方法。

注:若感兴趣想深入研究类加载器的内容可参考官方文档。[官网链接]

问题思考

如何创建自定义类加载器?

如何通过自定义类加载网络上的Class文件?

参考文章:

JVM | Java Virtual Machine - Javatpoint

Chapter 5. Loading, Linking, and Initializing

最后

以上就是称心彩虹为你收集整理的Java学习笔记之JVM(一)前言JVM是什么?JVM的结构认识类加载子系统(ClassLoader)问题思考的全部内容,希望文章能够帮你解决Java学习笔记之JVM(一)前言JVM是什么?JVM的结构认识类加载子系统(ClassLoader)问题思考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部