Java中的动态代理

动态代理采用动态字节码生成加载技术,来实现运行时动态生成代理类。

  • 不需要为每个主题生成形式一样的封装类。
  • 使用动态代理的生成方法可以在运行时指定代理类的执行逻辑。

生成动态代理的方法很多:JDK自带的动态代理,CGLIB,Javassist,ASM库。

动态代理类的生成主要涉及对ClassLoader的使用。JDK的动态创建类可以作为native实现,创建最快。在代理类的函数调用中,CGLIB和Javassist快于JDK的实现。

Hibernate中的代理模式

当hibernate加载实体bean时,并不会一次性将数据库中的数据都装载。默认情况下,通过属性的延迟加载或者关联表的延迟加载,来延迟加载提高系统初始化的速度。

Cache

缓存暂存数据,提供访问使用,来提升系统性能。减少系统访问热点数据的开销。最简单的缓存可以通过HashMap来实现,EHCache缓存出自Hibernate,是Hibernate默认的数据缓存解决方案。

对象复用

对象池化核心思想是,如果一个类的实例频繁被请求,就将这个实例保存在池中,等待需要时从池中取出供使用。
数据库连接池组件有C3P0和Proxool。JDK中,new的操作效率是相当高的,不需要考虑new所带来系统开销。new操作调用的类构造函数可能是耗时,可以考虑对象池化。

负载均衡

大型应用的系统负载很严重,为了保证程序的服务质量,需要使用多台计算节点协作,均衡负载。
典型Tomcat集群有黏性Session模式和复制Session模式。

黏性模式下,所有session信息被平均分配到Tomcat节点上,一旦宕机,所维护的数据就丢失。复制模式下,所有的session信息在各个Tomcat节点上保持一致。当一个节点的session信息修改时,session会被广播到其他Tomcat节点上,以保证Session同步。Terracotta进行Tomcat的session共享时,采用的是部分复制,仅仅传输变化的部分。

时间换空间

交换两个变量的值

a=a+b;
b=a-b;
a=a-b;

空间换时间

通过缓存