由JVM控制
- class 文件存储格式
- 何时加载
- 如何连接
- JVM如何执行字节码
程序员可以控制
- 字节码的生成
- 类加载器
Tomcat
- 部署在同一个Tomcat上的两个Web项目相互隔离
- 两个Web项目中使用的java类库可以相互共享
- Web服务器自身同web项目完全隔离
- 支持jsp的需要支持Hotswap
Tomcat下可以存放lib的四组目录
- /common: 类库可被Tomcat和所有Web应用程序共同使用(CommonClassLoader)
- /server: 类库只能被Tomcat使用,对所有Web项目不可见(CatalinaClassLoader)
- /shared: 类库可被所有Web项目共同使用,但是对Tomcat自身不可见(SharedClassLoader)
- /WebApp/WEB-INF: 类库仅仅可以被当前Web应用程序使用,对Tomcat和其他Web程序都不可见(WebappClassLoader)
Tomcat 6以后, /common被重命名为/lib, /server 和 /shared 默认隐藏,需要从/config/Catalina.properties [server.loader & shared.loader]设置
Java字节码生成
1.javac 字节码生成技术的老祖宗,由java实现
Spring 中Bean是面向切面编程的
动态代理实现了可以在原始类和接口还未知的时候,就确定代理类的行为,当代理类与原始类脱离直接联系之后,就可以很灵活地重用于不同地应用场景之中
学习JEE规范,去看JBoss源码。 学习类加载器,就去看OSGI源码
JVM .class -> memory -> 校验 -> 转化 -> 解析 -> 初始化 -> Java类型
运行期: 类的加载和连接过程
类从被加载到JVM内存开始到卸载出内存。 整个生命周期如下所示: 加载(Loading) -> 连接(Linking)[验证(Verification) -> 准备(Preparation) -> 解析(Resolution)] -> 初始化(Initialization) -> 使用(Using) -> 卸载(Unloading)
为了实现多态的特性, 解析的过程有可能會在初始化之后。其他过程需按部就班的一步一步完成
记载过程
- 通过一个类的全限定名称來获取定义此类的二进制字节流
- 将这个字节流所代表的静态存储结构转化为方法区运行时的数据结构
- 在java堆中生成代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口