欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

第44节:Java当中的JVM

程序员文章站 2022-10-05 09:34:34
Java当中JVM 01 在使用控制面板时的实质: 使用 ,然后变成为 通过运行 这个命令,在类加载器中(含有加载,验证,准备,解析,初始化,使用,卸载),到 为Java虚拟机中运行,在 中有方法区,堆内存,线程栈,本地方法栈, 计数器。 类加载器: 1. 加载, 2. 验证, 文件的版本是否能兼容 ......

第44节:Java当中的JVM

java当中jvm

01

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

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

第44节:Java当中的JVM

类加载器:

  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后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通
简书博客:

结语

  • 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
  • 小礼物走一走 or 点赞