tomcat和jvm的关系,主要谈项目执行流程和内存关系

tomcat和jvm的关系,根据自己的理解总结几句话:

运行一个Java程序(一个main方法),就会产生一个jvm实例,(我猜)此jvm实例的内存大小为默认大小或者如果给jvm设置了大小就按照设置的大小。main方法执行过程中产生的对象、局部变量等就放在这个jvm实例的内存里。main方法执行完毕jvm实例消亡。

▲ 普通的Java程序,加载一个class(到jvm内存中),是jvm的系统类加载器干的活。tomcat也是一个Java程序,也有main方法(在org.apache.catalina.startup.Bootstrap类中),所以tomcat的启动也会产生一个jvm实例;只是它比较特殊还是一个web容器,所以它加载一个class(到jvm内存中)是由自己专门的tomcat的类加载器去加载的。

▲ servlet是单例,tomcat启动时就会加载web.xml,web.xml被加载时不会生成servlet对象,servlet是在第一次发起请求的时候被实例化的。

▲ 每个请求对应开启一个线程,每线程分配1mb内存,开启一个线程需要耗用1mb的jvm内存空间用于作为线程栈之用。 (我猜)用来存此线程对象的引用和request、response等线程内的局部变量。

原生servlet项目_,一个找servlet的请求过来后,就可以直接找到这个servlet对象,然后调用此对象里的doGet等方法。

ssh或者ssm框架项目_,则tomcat启动时就通过加载配置文件或者注解把controller、service、dao对象创建了,并放到spring容器(ApplicationContext对象)中,当一个请求过来的时候,就可以直接找到这个controller对象并调用它里面相应的方法,再根据方法里的代码有选择的调service、dao对象里的方法。

▲ 一个tomcat包含一个main方法,产生一个jvm实例,所以一个tomcat下的所有项目使用同一个jvm实例。

 

待总结:

△ jvm的系统类加载器

△  tomcat的类加载器

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值