理解JVM虚拟机 --笔记

本文详细介绍了JVM的工作原理,包括类加载过程中的加载、链接、初始化等步骤,并解释了clinit与init的区别。同时,还介绍了JVM内存区域划分,如方法区、程序计数器、虚拟机栈和堆的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理解JVM虚拟机
1、真正理解编译器
2、分析类加载过程

加载:
加载class文件的信息加载到内存中。由硬盘到内存的迁移;
链接:
将加载阶段加载到内存中的二进制数据整合到虚拟机中。
验证:
文件格式验证、元数据验证等等
准备:
为类静态变量分配内存,并将其初始化为默认值,给常量分配内存并设置值
解析:
把类型中的符号引用转换为直接引用

初始化为类的静态变量赋予正确的初始化值按照从上到下的顺序()
使用:这个阶段就是调用方法实例化出对象来使用了。
卸载:当类使用完了,在也用不到的时候就可以将类卸载了(必须保证所有的实例被GC(垃圾回收))

理解clinit和init
clinit: 类的静态变量初始化,类的静态语句块
init: 类变量初始化和类语句块、构造函数
在创建类的实例时,先调用clinit,再调用init


/*
1  为类的静态变量分配内存,并将其初始化为默认值,
 singleTone = null  Count1 = 0, Count2 = 0
2  为类的静态变量赋予正确的初始化值按照从上到下的顺序
singleTone = new SingleTone()
count1 = 1; count2 = 1;
正确的初始化
count2 = 0;

输出结果: count1 = 1; count2 = 0;
 */

class SingleTone {
    private static SingleTone singleTone = new SingleTone();
    public  static  int count1;
    public  static  int count2 =0;

    public  SingleTone() {
        count1 ++;
        count2 ++;
    }
    public  static  SingleTone getInstance() {
        return singleTone;
    }
}

public class Main {
    public static void main(String[] args) {
	// write your code here
        SingleTone instance = SingleTone.getInstance();
        System.out.println("count1 = "+ instance.count1);
        System.out.println("count2 = "+ instance.count2);

    }
}


方法区:用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域
程序计数器:它的作用是当前线程所执行的字节码的行号指示器
虚拟机栈:线程私有的,“栈帧”用于存储局部变量表(包括参数)、操作栈、方法出口等信息;
:被各个线程共享的内存、用来存放对象的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值