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的类加载器