一个类里包含一个main方法,执行main方法,此时会自动创建一个JVM进程,会默认有一个main线程,这个main线程就负责这个main方法的代码,进而创建各种对象
Tomcat,类都会加载到JVM中,spring容器会将我们的类实例化成bean,有工作线程会来执行我们bean实力对象里的方法和代码,进而会创建其他的各种类,实现业务逻辑
(1)Tomcat有个类加载器,会将我们自己写的系统中的类加载到metaspace元数据区
(2)Tomcat启动会去启动spring容器
(3)spring容器启动后会去扫描代码
(4)spring容器通过反射技术,将创建的bean实例放到堆内存中
public void doRequest(){
MyService myService = new MyService();
myService .doService();
}
对象的分配+流转过程如下:
(1)浏览器发送请求,会有自己独立的工作线程,该工作线程有自己的独享内存空间
(2)线程有自己私有的栈内存,会对doRequest()方法创建一个栈帧存放在栈内存中,栈帧中有一个局部变量表
(3)MyService的对象放在堆内存中
(4)线程私有栈内存中栈帧指向公共堆内存中的MyService对象(引用)
(5)栈先入后出,执行myService.doService()方法时,将doService()进行压栈操作
(6)线程私有栈内存中,存放doService的栈帧以及局部变量表
(7)栈顶doService,栈底doRequest
(8)执行完毕后,doServiceh会出栈
- 执行完毕后,doRequest会出栈
- 销毁doRequest、doService栈帧、局部变量表(查一下,什么时候执行销毁)
总结:首先加载类,然后从main函数开始运行。中间过程涉及new关键字的内存分配,虚拟机栈的压栈弹栈,以及程序计数器,操作数栈等等一系列的的JVM运转。最后失去引用的对象会被GC回收