java main jvm_Java当中的JVM

01

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

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

类加载器:加载,

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

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

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

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

使用,

卸载

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)中。

————————————————

版权声明:本文为CSDN博主「Java架构闲谈」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值