Java编译器输出的指令流,基本上[1]是一种基于栈的指令集架构,它们依赖操作数栈进行工作
与之相对的另外一套常用的指令集架构是基于寄存器的指令集
举个最简单的例子,分别使用这两种指令集计算“1+1”的结果,基于栈的指令集会是这
样子的:
//基于栈的指令 iconst_1 iconst_1 iadd istore_0 //基于寄存器指令 mov eax,1 add eax,1
基于栈的指令集主要的优点就是可移植, 缺点是执行速度慢,相同操作指令数要多很多.
寄存器由硬件直接提供[2],程序直接依赖这些硬件寄存器则不可避免地要受到硬件的约束。
虽然栈架构指令集的代码非常紧凑,但是完成相同功能所需的指令数量一般会比寄存器架构多,因为出栈、入栈操作本身就产生了相当多的指令数量。更重要的是,栈实现在内存之中,频繁的栈访问也就意味着频繁的内存访问,相对于处理器来说,内存始终是执行速度的瓶颈。
Tomcat服务器的类加载架构
OSGi(Open Service Gateway Initiative)是OSGi联盟(OSGi Alliance)制定的一个基于Java语言的动态模块化规范,
类库的可见性能得到非常精确的控制,一个模块里只有被Export过的Package才可能由外界访问,其他的Package和Class将会隐藏起来.
除了更精确的模块划分和可见性控制外,引入OSGi的另外一个重要理由是,基于OSGi的程序很可能(只是很可能,并不是一定会)可以实现模块级的热插拔功能,当程序升级更新或调试除错时,可以只停用、重新安装然后启用程序的其中一部分,这对企业级程序开发来说是一个非常有诱惑力的特性.
但并非所有的应用都适合采用OSGi作为基础架构,OSGi在提供强大功能的同时,也引入了额外的复杂度,带来了线程死锁和内存泄漏的风险。