专栏首页JavaEEJVM --- 结构体系介绍

JVM --- 结构体系介绍

1. JVM的位置:

JVM位置

JVM是运行在操作系统之上的虚拟机,跟硬件没有直接交互。这也就体现了它跨平台的优越性。只要你这个操作系统能运行JVM,那么就可以运行java程序。

2. JVM体系结构:

下图为JVM的体系结构,灰色的表示线程私有,且该区域不存在垃圾回收,橙色的表示线程共享,且存在垃圾回收。

jvm体系结构

3. 类加载器ClassLoader:

负责加载class文件,class文件中文件开头有特定的标识,随便写个txt改成class,jvm是不能加载的。classLoader的作用就是将class文件加载到内存中,并将这些内容转换成方法区中的运行时数据结构。通过classLoader加载后,就会生成类的模板,之后new实例的时候,都是通过这个模板生成。类的模板就放在方法区。

(1). 类加载器分为以下几类:

  • 启动类加载器(Bootstrap Class Loader):C++语言写的,加载的是jre中的rt.jar。为什么我们可以直接用Object类,为什么能直接用ArrayList类?因为这些类都在rt.jar中,并且通过启动类加载器加载到了内存中。
  • 扩展类加载器(Extension Class Loader):java写的,加载的是jre/lib/ext/*.jar。因为java编写之初没写那么多功能,后来陆续加了一些功能,就被称为扩展类,扩展类加载器就是用来加载这些类的。
  • 应用程序类加载器(App Class Loader):加载用户自己写的类。比如我写了一个Test类,就是靠应用类加载器去加载。
  • 用户自定义类加载器:用户可以继承java.lang.ClassLoader类,实现自己的类加载器,定制加载方式。

(2). 类加载器之间的关系:

public class JvmDemo {
    
    public static void main(String[] args) {
        Object obj = new Object();
        System.out.println(obj.getClass().getClassLoader()); // 启动类加载器,打印出来是null
        
        JvmDemo jvmDemo = new JvmDemo();
        System.out.println(jvmDemo.getClass().getClassLoader()); // 应用类加载器
        System.out.println(jvmDemo.getClass().getClassLoader().getParent());
        System.out.println(jvmDemo.getClass().getClassLoader().getParent().getParent());
    }
}

打印的结果是:

运行结果

得出结论

  • 如果是启动类加载器,打印出来的是null;
  • 三个类加载器的关系为:应用类加载器是孙子,扩展类加载器是父亲,启动类加载器是爷爷,它们就是祖孙三辈的关系。

(3). 双亲委派机制:

别把这个想得有多难,可以借用一句话辅助理解:“我爸是李刚,有事找他”。应用类加载器要加载一个类的时候,它会先让它的父亲扩展类加载器去加载,同样的,扩展类加载器又会让它的父亲启动类加载器去加载。启动类加载器如果没加载到,就告诉扩展类加载器,扩展类加载器如果没加载到,再告诉应用类加载器,这个时候才轮到应用类加载器加载。也就是说,孙子要办事先找父亲,父亲又找爷爷,能不自己动手坚决不自动动手。

(4). 沙箱安全:

为什么要用双亲委派机制?看下面的例子:

package java.lang;

public class String {
        public static void main(String[] args) {
        System.out.println("are you ok?");
    }
}

我自己新建了一个java.lang包,写了一个String类。运行却发现报错了:

运行结果

我写的String中明明就有main方法,它却说没有,这也验证了双亲委派机制,说明加载的不是我自己写的String类,而是rt.jar中的String类。用双亲委派机制,在类路径相同的情况下,优先加载java自带的,这样就可以保证java自带的那些类的安全,保证它们不被污染,这就是沙箱安全。

4. 本地方法栈:

java有些方法底层是通过C语言实现的,这些方法栈java源码中都没有实现,并且有native关键字修饰。比如线程的start方法,new Thread().start(),其实调用的是start0()方法,这个方法就是一个native方法,调用的时候通过本地方法接口,从本地方法库中将其加载到本地方法栈中。

5. 程序计数器:

也叫PC寄存器,其实就是一个指针。比如在循环、递归的时候,程序要如何知道跳出这层循环后应该执行哪行代码,递归的执行是怎么个顺序?这些都靠程序计数器来完成,它可以让程序知道接下来该执行什么。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SMP、NUMA、MPP体系结构介绍

    从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构 (SMP : Symmetric Multi-Processor) ,非一致存储访问结构 ...

    狼啸风云
  • JVM 的体系结构

     栈空间里存放的是局部变量表,动态链接,操作数栈,以及是方法的出口;每个栈帧都会随着方法的开始和结束相应的出栈和入 栈;

    用户2141593
  • JVM体系结构认知

    虚拟机 何为虚拟机呢?虚拟机是模拟执行某种指令集体系结构(ISA)的软件,是对操作系统和硬件的一种抽象。其软件模型如下图所示: ? 计算机系统的这种抽象类似于...

    xiangzhihong
  • JVM体系结构认知

    虚拟机 何为虚拟机呢?虚拟机是模拟执行某种指令集体系结构(ISA)的软件,是对操作系统和硬件的一种抽象。其软件模型如下图所示: ? 计算机系统的这种抽象类...

    xiangzhihong
  • JVM体系结构认知

    虚拟机 何为虚拟机呢?虚拟机是模拟执行某种指令集体系结构(ISA)的软件,是对操作系统和硬件的一种抽象。其软件模型如下图所示: ? 计算机系统的这种抽象类似于...

    Java高级架构
  • JVM体系结构详解

    虚拟机是物理机的软件实现。Java是用WORA(编写一次运行到任何地方)的概念开发的,它在VM上运行。编译器将Java文件编译成Java .class文件,然后...

    挨踢小子部落阁
  • JVM架构介绍

    每个Java开发人员都知道字节码将由JRE (Java Runtime Environment)执行。但是很多人不知道JRE是Java虚拟机(JVM)的实现,它...

    程序你好
  • JVM解毒——JVM与Java体系结构

    Java开发都知道JVM是Java虚拟机,上学时还用过的VM也叫虚拟机,先比较一波

    乔戈里
  • kubernete架构体系介绍

    我们用docker制作了一个容器镜像,使用docker命令就可以跑起来。但是当容器成千上万时,用docker命令来管理肯定是不够的。而且生产上的自动发布、容器监...

    jinjunzhu

扫码关注云+社区

领取腾讯云代金券