Java程序性能优化-代理模式(6)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java程序性能优化-代理模式(6)相关的知识,希望对你有一定的参考价值。

参考技术A

     代理模式( )

  以上代码分别生成了 种代理 并对生成的代理类进行高频率的调用 最后输出各个代理类的创建耗时 动态类类名和方法调用耗时 结果如下

  createJdkProxy:

  JdkProxy class:$Proxy

  callJdkProxy:

  createCglibProxy:

  CglibProxy class:$javatuning ch proxy IDBQuery$$EnhancerByCGLIB$$b a bbf

  callCglibProxy:

  createJavassistDynProxy:

  JavassistDynProxy class:javatuning ch proxy IDBQuery_$$_javassist_

  callJavassistDynProxy:

  createJavassistBytecodeDynamicProxy:

  JavassistBytecodeDynamicProxy class:javatuning ch proxy IDBQueryJavaassistBytecodeProxy

  callJavassistBytecodeDynamicProxy:

  可以看到 JDK的动态类创建过程最快 这是因为在这个内置实现中defineClass()方法被定义为native实现 故性能高于其他几种实现 但在代理类的函数调用性能上 JDK的动态代理就不如CGLIB和Javassist的基于动态代码的代理 而Javassist的基于代理工厂的代理实现 代理的性能质量最差 甚至不如JDK的实现 在实际开发应用中 代理类的方法调用频率通常要远远高于代理类的实际生成频率(相同类的重复生成会使用cache) 故动态代理对象的方法调用性能应该作为性能的主要关注点

  注意 就动态代理的方法调用性能而言 CGLIB和Javassist的基于动态代码的代理都优于JDK自带的动态代理 此外 JDK的动态代理要求代理类和真实主题都实现同一个接口 而CGLIB和Javassist没有强制要求

   Hibernate中代理模式的应用

  用代理模式实现延迟加载的一个经典应用就在Hibernate框架中 当Hibernate加载实体bean时 并不会一次性将数据库所有的数据都装载 默认情况下 它会采取延迟加载的机制 以提高系统的性能 Hiberante中的延迟加载主要有两种 一是属性的延迟加载 二是关联表的延时加载 这里以属性的延迟加载为例 简单阐述Hibernate是如何使用动态代理的

  假定有用户模型

  public class User implements java io Serializable

  private Integer id;

  private String name;

  private int age;

  //省略getter和setter

  使用以下代码 通过Hibernate加载一条User信息

  public static void main(String[] args) throws SecurityException

  NoSuchFieldException

  IllegalArgumentException

  IllegalAccessException

  //从数据库载入ID为 的用户

  User u=(User)HibernateSessionFactory getSession() load(User class )

  //打印类名称

  System out println( Class Name: +u getClass() getName())

  //打印父类名称

  System out println( Super Class Name: +u getClass() getSuperclass()

  getName())

  //实现的所有接口

  Class[] ins=u getClass() getInterfaces()

  for(Class cls:ins)

  System out println( interface: +cls getName())

  

  System out println(u getName())

  

       返回目录 Java程序性能优化 让你的Java程序更快 更稳定

   编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

       J ME移动开发实战教学视频

  Visual C++音频/视频技术开发与实战

  Oracle索引技术

lishixinzhi/Article/program/Java/gj/201311/27829

Java程序性能优化技巧

多线程、集合、网络编程、内存优化、缓冲、、spring、设计模式、软件project、编程思想

1、生成对象时,合理分配空间和大小
new ArrayList(100);

2、优化for循环
Vector vect = new Vector(1000);
for( inti=0; i<vect.size(); i++){
   ...
}
for循环部分改写成:
int size = vect.size();
for( int i=0; i>size; i++){
...
}
假设size=1000,就能够降低1000次size()的系统调用开销,避免了循环体反复调用。

3、new一个实例对象,new在什么位置(尽量在使用时再创建该对象)。

4、异常处理技巧

5、尽量使用局部变量和静态变量

6、尽量不适用多线程同步

7、尽可能的使用Java自身提供的API

8、尽量降低I/O操作(控制台、日志)

9、尽量使用缓存流(尽可能使用带有Buffer的类取代没有Buffer的类,BufferedReader、BufferedWriter、BufferedInputStream)

10、sql优化、存储过程、视图、连接池(C3P0 、DBCP)

11、数据库数据分级存储
将常常訪问的数据和訪问频度低的数据,分别存放到不同的分区。甚至存放到不同的数据库server,以便合进分配硬盘I/O及系统I/O。

12、缓存策略
假设有些数据要常常要从数据库中读取。同一时候,这些数据又不常常变化,这些数据就能够在系统中缓存起来,使用时直接读取缓存。而不用频繁的訪问数据库读取数据。
缓存工作能够在系统初始化时一次性读取数据。特别是一些仅仅读的数据,当数据更新时更新数据库内容,同一时候更新缓存的数据值。
Java经常使用的缓存技术产品有:Redis、MemoryCache、OSCache等。

13、html静态化

14、不用保存太多的信息在HttpSession中

15、在使用大数据对象时,因此建议在对象使用完成后。手动设置成null(避免内存溢出)。
















以上是关于Java程序性能优化-代理模式(6)的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式6——代理模式

程序设计优化——代理模式之动态代理

6.2Java静态代理设计模式

java策略模式和代理模式有啥区别?

JAVA设计模式之代理模式

java学习之动态代理模式