zoukankan      html  css  js  c++  java
  • 第44节:Java当中的JVM

    标题图

    Java当中JVM

    01

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

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

    Java运行条件

    类加载器:

    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 点赞
  • 相关阅读:
    SQL Server Audit监控触发器状态
    SQL Server 数据变更时间戳(timestamp)在复制中的运用
    SQL Server 更改跟踪(Chang Tracking)监控表数据
    SQL Server 变更数据捕获(CDC)监控表数据
    SQL Server 事件通知(Event notifications)
    SQL Server 堆表行存储大小(Record Size)
    SQL Server DDL触发器运用
    SQL Server 默认跟踪(Default Trace)
    SQL Server 创建数据库邮件
    SQL Server 跨网段(跨机房)FTP复制
  • 原文地址:https://www.cnblogs.com/dashucoding/p/9665790.html
Copyright © 2011-2022 走看看