JVM详解

类加载器(classloader)==>根类加载器(c++实现),扩展加载器,系统(应用)加载器和自定义加载器

用户自定义加载器:继承自抽象类java.lang.Classloader,来定制自己的加载器

顾名思义,用于加载class字节码文件,作用是把字节码文件装载到内存中(硬盘到内存)。当执行代码的时候会有一个jvm的进程,有一个主线程执行,代码执行完毕后会结束当前的进程。有以下几种情况jvm结束:

1.程序正常结束

2.执行System.exit()方法

3.遇到了error或者exception而终止

4.操作系统出现错误


jvm加载执行的顺序:

类的加载==》连接====》初始化

加载:将类load到内存中。

连接:1.验证=》确保被加载类的正确性

            2.准备=》为类的静态变量分配内存,并初始化为默认值(例:int型默认为0,引用默认的为null)

            3.解析=》把类中的符号引用转化为直接引用

初始化为静态的变量赋予正确的初始值(注意默认值与初始值的区别)


只有是类的主动使用(包括new,继承关系,静态的变量,静态的方法),首次使用才执行初始化工作。

package com.qq.server;

public class Test
{
	public static void main(String[] args)
	{

		Singleton singleton = Singleton.getInstance();

		System.out.println("a=" + singleton.a);

		System.out.println("b=" + singleton.b);
	}
}

class Singleton
{

	private static Singleton singleton = new Singleton(); //  a=1,b=0
	
	public static int a;
	public static int b = 0;

	//private static Singleton singleton = new Singleton();   a=1,b=1;
	public static Singleton getInstance()
	{
		return singleton;
	}

	private Singleton()
	{
		a++;
		b++;
	}

}

上面的代码执行的顺序即可反映静态语句的执行顺序。

类的主动使用:

1.创建累的实例(new)

2.访问某个类的静态变量(注:该静态变量必须要在当前类中,如果存在继承,则初始化静态变量所在的类)

3.调用类的静态方法

4.反射使用(Class.forName("java.lang.String"))

5.初始化一个类的子类

6.jvm被标明的启动类

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值