JVM 原理探究

时间:2021-7-3 作者:qvyue

1.JVM 的位置

JVM是运行在操作系统之上的。

JVM 原理探究
image-20210701211628576.png

2.JVM 的体系结构

JVM 原理探究
image-20210701214300114.png
  • 首先垃圾回收一定不会在栈、本地方法栈、程序计数器中,栈用完后系统会自动释放掉
  • 所谓的JVM调优,99%其实就是在堆与方法区中进行的,而其中99%就是在调,我们说方法去其实就是一个特殊的堆

3.类加载器 Class Loader

类加载器的作用:加载Class文件

例如,我们有一个 Student 实体类

当我们执行 new Student(); 后,说明抽象的 Student 类变为一个具体的实例。引用将会被放入栈中,而具体的对象则会被放入堆中。

JVM 原理探究
image-20210702210423885.png

上图就是诠释了对象实例化的过程,该过程也就是在解释new关键字与Class关键字,我们说类是模板,对象是具体的实例化。

package com.wangcp.jvmstudy.study01;

public class Car {
    public static void main(String[] args) {
        // 类是模板,对象是具体的实例
        Car car1 = new Car();
        Car car2 = new Car();
        Car car3 = new Car();
        System.out.println("-----------------Car对象实例--------------");
        System.out.println(car1.hashCode());
        System.out.println(car2.hashCode());
        System.out.println(car3.hashCode());

        Class extends Car> aClass1 = car1.getClass();
        Class extends Car> aClass2 = car2.getClass();
        Class extends Car> aClass3 = car3.getClass();
        System.out.println("-----------------Car Class--------------");
        System.out.println(aClass1.hashCode());
        System.out.println(aClass2.hashCode());
        System.out.println(aClass3.hashCode());
    }
}

结果为:

-----------------Car对象实例--------------
25041030
13738737
17699851
-----------------Car Class--------------
17961198
17961198
17961198

由以上代码的执行结果我们看出,new 出的三个 Car 对象是不同的,但Class模板是同一个。

4.双亲委派机制

双亲委派机制的主要目的是为了程序安全,例如我们自己新建包 java.lang 并且在该包下新建 String 类并添加了 toString() 方法,但在实际调用时会发现无法使用并抛出异常。因为类加载时会先向上委托直到根加载器去检查是否能够加载当前类,在根类中发现了 String 类后会直接进行加载不会再向下调用。

双亲委派机制步骤:

  • 1.类加载器收到类加载的请求

  • 2.将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类(根)加载器

  • 3.启动类加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器。否则,抛出异常,通知子加载器进行加载。

  • 4.重复步骤 3

持续学习,不断更新,每天进步一点点!

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。