jvm全套分析(全过程思路加图解)

!!!!!!!先了解整体流程,在去深入挖掘,此篇文章用链接的方式帮助大家避免整体方向的丢失,希望大家在看完整篇后再点进去了解自己了解不足的内容

目录:
java虚拟机汇总<<== 现在位置

  1. class文件结构分析
    1).class文件常量池中的常量项结构
    2). 常用的属性表的集合
  2. 类加载过程
    1).类加载器的原理以及实现
  3. 虚拟机结构分析
    1).jdk1.7和1.8版本的方法区构造变化
    2).常量池简单区分
  4. 对象结构分析
    1).压缩指针详解
  5. gc垃圾回收
  6. 对象的定位方式

尽量用最通俗的语言讲解

运行过程分析
1.编写java类,列如:

	public class Test{
    
    
		static int a;
		int b;
		public int haha(){
    
    
			int a = 1;
			int b = 2'
			return a+b;
		}
		public static void main(String []args){
    
    
			Test dex = new Test();
			System.out.println(dex.haha());
		}
	}

遍历后成为一个class文件 ,你的这个东西,class文件,放在硬盘中(不是内存)!!!,虚拟机还没有加载此class文件,这个形成class的过程叫编译,(生成的class文件里面到底是什么结构??): (class文件结构分析)

2.接下来你的这个class文件就一直放在外存中了,什么时候进入内存呢?那就是触发类加载(类初始化)的时候了,换句大白话来说就是用到你这个类了就把你加载进内存,如果有父类先初始化父类,过程都一样,(怎么触发类加载,以及类加载的过程(加载链接初始化)),在此,因为你写了main入口方法,此时会触发此类的类加载,类加载执行过后,你的内存里就存放了此类的:Class对象,元数据,常量,方法等,存放在你的内存的各个区域,(java虚拟机结构分布解析),在加载过程中,会执行你的静态代码块里面的内容,也就是说此时你的静态变量和静态方法都已经初始化好了,构造代码块和构造函数还没有被执行,
下一步
3.类加载完成过后类的各个信息都已经分布好,接下来如果你的main方法中什么也不写,那不会有任何动静,如果创建了本类对象newTest(),即如果你new了对象,则先去执行此类的构造代码块进行初始化,然后调用此类构造方法(有父类先执行父类的),随后对象在堆中创建完毕 (堆中对象结构图解),执行顺序:静态代码块,初始化块,构造函数,此时没有栈中的引用,会在下一次gc时回收(gc垃圾回收算法详解),如果存在栈中的引用即,main方法中写Test dex = new Test();则会去栈中分配变量将指向对象地址的位置,(栈中对象定位的方式(句柄池,直接引用)),随后如果调用了方法,则会去方法区找对应的方法,在此main线程中插入一个方法栈栈帧,表示此方法的执行,运行过此栈帧后返回给main方法栈帧一个int类型的值,使main线程继续执行

4,此main方法结束,整个执行流程结束由于main方法结束,定义的栈中的对new Test()的局部变量引用消失,此对象将会在下次gc时当作垃圾回收

猜你喜欢

转载自blog.csdn.net/lioncatch/article/details/105908322
今日推荐