Java优化编程的37条法则

13 篇文章 0 订阅
[quote]1.JVM管理两种类型的内存:堆内存(heap),栈内存(stack),堆内在主要用来存储程序在运行时创建或实例化的对象与变量.而栈内存则是用来存储程序代码中声明为静态(static)(或非静态)的方法.[/quote]


[quote]2 .JVM中对象的生命周期,创建阶段,应用阶段,不可视阶段,不可到达阶段,可收集阶段,终结阶段,释放阶段[/quote]


[quote]3.避免在循环体中创建对象,即使该对象占用内存空间不大.[/quote]

 
for(int i=0;i<10000;++i){ 
  Object obj = new Object();
  System.out.println("obj="+obj);
  }



  [quote]应改成[/quote]


 Object obj = null; 
  for(int i=0;i<10000;++i){
  obj = new Object();
  System.out.println("obj="+obj);
  }



[quote]4.软引用的主要特点是具有较强的引用功能.只有当内存不够的时候,才回收这类内存,因此在内存足够的时候,它们通常不被回收.它可以用于实现一些常用资源的缓存,实现Cache的功能[/quote]

   A a = new A(); 
  SoftReference sr = new SoftReference(a);
  a = null;
  if(sr !=null){
  a = sr.get();
  }else{
  a = new A();
  sr = new SoftReference(a);
  }


[quote]5.弱引用对象与Soft引用对象最大不同就在于:GC在进行回收时,需要通过算法检查是否回收Soft引用对象,而对于Weak引用对象,GC总是进行回收.[/quote]

 A a = new A(); 
  WeakReference wr = new WeakReference(a);
  a = null;
  if(sr !=null){
  a = wr.get();
  }else{
  a = new A();
  wr = new WeakReference(a);
  }


[quote]6.共享静态变量存储空间[/quote]

[quote]7.有时候我们为了提高系统性能,避免重复耗时的操作,希望能够重用一些创建完成的对象,利用对象池实现.类似JDBC连接池.[/quote]

[quote]8.瞬间值,序列化对象大变量时,如果此大变量又没有用途,则使用transient声明,不序列化此变量.同时网络传输中也不传输.[/quote]

[quote]9.不要提前创建对象[/quote]

void f(){ 
  int i;
  A a = new A();
  if(....){
  a.showMessage();
  }
  }



 [quote] 改成[/quote]


   void f(){ 
  int i;
  A a = null;
  if(....){
  //用到时才实例化
  a = new A();
  a.showMessage();
  }
  }


[quote]10 .(1)最基本的建议就是尽早释放无用对象的引用

  A a = new A();

  a = null; //当使用对象a之后主动将其设置为空

  (2)尽量少用finalize函数.

  (3) 如果需要使用经常用到的图片展,可以使用软引用.

  (4) 注意集合数据类型,包括数组,树等数据,这些数据结构对GC来说,回收更为复杂,

  (5) 尽量避免在类的默认构造器中创建,初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费.

  (6) 尽量避免强制系统做垃圾内存回收.

  (7) 尽量避免显式申请数组空间.

  (8) 尽量在合适的场景下使用对象池技术以提高系统性能,缩减系统内存开销.[/quote]

[quote]11.当做数组拷贝操作时,采用System.arraycopy()方法完成拷贝操作要比采用循环的办法完成数组拷贝操作效率高[/quote]

[quote]12. 尽量避免在循环体中调用方法,因为方法调用是比较昂贵的.[/quote]

[quote]13. 尽量避免在循环体中使用try-catch 块,最好在循环体外使用try--catch块以提高系统性能.[/quote]

[quote]14. 在多重循环中,如果有可能,尽量将最长的循环放在最内层,最短的循环放在最外层,以减少循环层间的变换次数.[/quote]

[quote]15. 在需要线程安全的情况下,使用List list = Collections.synchronizedList(new ArrayList());[/quote]

[quote]16. 如果预知长度,就设置ArrayList的长度.[/quote]

[quote]17. ArrayList 与 LinkedList 选择,熟悉底层的实现原理,选择适当的容器.[/quote]

[quote]18. 字符串累加采用StringBuffer.[/quote]

[quote]19. 系统I/O优化,采用缓冲和压缩技术.优化性能.[/quote]

[quote]20. 避免在类在构造器的初始化其他类[/quote]

[quote]21 尽量避免在构造中对静态变量做赋值操作[/quote]

[quote]22. 不要在类的构造器中创建类的实例[/quote]

[quote]23. 组合优化继承[/quote]

[quote]24. 最好通过Class.forname() 动态的装载类[/quote]

[quote]25. JSP优化,采用out 对象中的print方法代替println()方法[/quote]

[quote]26 .采用ServletOutputStream 对象代替JSPWriter对象[/quote]

[quote]27. 采用适当的值初始化out 对象缓冲区的大小[/quote]

[quote]28. 尽量采用forward()方法重定向新的JSP[/quote]

[quote]29. 利用线程池技术处理客户请求[/quote]

[quote]30.Servlet优化
(1) 通过init()方法来缓存一些静态数据以提高应用性能.

  (2) 用print() 方法取代println()方法.

  (3) 用ServletOutputStream 取代 PrintWriter.

  (4) 尽量缩小同步代码数量
[/quote]

[quote]31. 改善Servlet应用性能的方法

  (1)不要使用SingleThreadModel

  (2)使用线程池ThreadPool[/quote]
[quote]32. EJB优化

  实体EJB:

  (1)实体EJB中常用数据缓存与释放

  (2)采用延迟加载的方式装载关联数据

  (3)尽可能地应用CMP类型实体EJB

  (4)直接采用JDBC技术处理大型数据[/quote]
[quote]33. 优化JDBC连接

  (1)设置合适的预取行值

  (2)采用连接池技术

  (3)全合理应用事务

  (4)选择合适的事务隔离层与及时关闭连接对象[/quote]


[quote]34. PreparedStatemetn只编译解析一次,而Statement每次都编译解析.[/quote]

  [quote]35. 尽可能地做批处理更新[/quote]

  [quote]36. 通过采用合适的getXXX方法提高系统性能[/quote]

  [quote]37. 采用设计模式.[/quote]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值