• Java当中的JVM


    Java当中JVM

    01

    在使用控制面板时的实质:

    Hello.java使用javac,然后变成为Hello.class通过运行java这个命令,在类加载器中(含有加载,验证,准备,解析,初始化,使用,卸载),到jvm为Java虚拟机中运行,在jvm中有方法区,堆内存,线程栈,本地方法栈,PC计数器。

    类加载器:

    1. 加载,

    2. 验证,class文件的版本是否能兼容当前的Java虚拟机版本,然后class文件要满足虚拟机的规范。

    3. 准备,需要准备什么呢?就是要进行类成员的初始化为初始值,其中为final修饰的类变量除外,final变量就直接初始化为变量值,而类成员不一样。

    4. 解析,什么是解析呢?就是把符号引用解析为直接引用,就是我们变量xxx,这种代表变为直接引用,什么是直接引用呢?就是内存地址,如我们常见的xxx0203r0e,这种。

    5. 初始化,把关于static修饰的变量或者是static静态代码块按照顺序组成构造器进行初始化变量。

    6. 使用,

    7. 卸载

    JVM

    JVM: 方法区(保存所有类的信息,通过常量池来保存生成所有类信息的对象),堆内存,线程栈,本地方法栈,计数器。

    // 在控制面板中,反编译
    
    javap -c xxx 
    就是将字节码反编译为字节码的指令输出
    public class Hello{
     public Hello();
      Code:   
       0: aload_0   
       1: invokespecial #1
       4: return
     public static void main(java.lang.String[]);
      ...
    }

    把程序放进jvm中运行,到线程栈中运行,主方法main(主线程),在线程栈中运行如果有遇到new对象关键字时,main这个主线程就会在自己的内存中(线程栈)声明一个的对象(对象的引用指向堆内存中开辟的对象),Hello hello;在jvm中有个堆内存,就会申请一片空间内存地址,即创建一个对象,实例变量,实例方法从方法区中指向堆内存。

    public class Hello{
     public static void main(String[] args){
      Hello hello = new Hello();  
      // 对象的声明 和 创建对象
     }
    }

    类加载到虚拟机中:

    public class Demo
      static {
       System.out.println("静态代码块");
      }
      {
       System.out.println("普通代码块");
      }  
      public Demo(){
       System.out.println("构造方法");
      }  
      public static void main(String[] args){   
       new Demo();
      }
    }
    // 结果
    
    静态代码块
    普通代码块
    构造方法
    // 加载 验证 准备 解析 初始化 使用 卸载
    
    Demo.java -> Demo.class -> 加载进入虚拟机中,类加载器 (验证类信息,元素信息,版本,字节码,准备,初始化类变量,解析把符号引用解析为直接引用,进行初始化就是把static变量和static静态代码块进行初始化变量)

    步骤:

    在堆内存中执行的顺序就是加载实例信息,然后在进行构造方法。

    02

    了解static案例

    // 父类
    
    public class F
      static {
       System.out.println("F静态代码块");
      }
      {
       System.out.println("F普通代码块");
      }  
      public F(){
       System.out.println("F构造方法");
      }
    }
    // 子类
    
    public class S extends F {
     static {
      System.out.println("S静态代码块");
     }
     {
       System.out.println("S普通代码块");
      }  
     public S(){   
       super(); // 默认的
       System.out.println("S构造方法");
     }
    }
    // 测试
    
    public class Demo { 
    public static void main(String[] args){  
       // 创建子类对象
       new S();
      }
    }
    // 结果
    
    F静态代码块
    S静态代码块
    F普通代码块
    F构造方法
    S普通代码块
    S构造方法

    程序进入JVM中的方法区,子类继承父类,父类进行加载实例信息进入到开辟的内存中,然后执行完再执行构造方法,在堆内存中new一个对象,new S(); 在子类的构造方法中会有默认的super(),加载父类,如果子类调用默认调用super(),而父类没有无参的构造方法,而是有参的构造方法,那么就要自己添加,在super(xxx)中。

    往后余生,唯独有你
    简书作者:达叔小生
    90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通
    简书博客: 

    https://www.jianshu.com/u/c785ece603d1

    结语

    • 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注

    • 小礼物走一走 or 点赞

    这是一个有质量,有态度的公众号

    喜欢本文的朋友们

    欢迎长按下图关注订阅号

    收看更多精彩内容

  • 相关阅读:
    C#获取当前堆栈的各调用方法列表
    JS | 你真的会用 console.log 吗?
    antd form表单自定义验证
    C# 如何去空格
    CSS 网络安全字体
    Surface Book 3真是太快了
    Waypoints
    es6 去掉空格_js去除字符串中的所有空格(包括前后,中间存在的所有空格)
    Facebook 新一代 React 状态管理库 Recoil
    独处时必看悬疑推理剧大全
  • 原文地址:https://www.cnblogs.com/dashucoding/p/12178597.html
Copyright © 2020-2023  润新知