Java优化编程的37条法则

白色玫瑰 程序猿

时间: 2023-07-11 阅读: 1 字数:4725

{}
[quote]1.JVM管理两种类型的内存:堆内存(heap),栈内存(stack),堆内在主要用来存储程序在运行时创建或实例化的对象与变量.而栈内存则是用来存储程序代码中声明为静态(static)(或非静态)的方法.[/quote]\r\n\r\n\r\n[quote]2 .JVM中对象的生命周期,创建阶段,应用阶段,不可视阶段,不可到达阶段,可收集阶段,终结阶段,释放阶段[/quote]\r\n\r\n\r\n[qu...

[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]

原文地址:https://blog.csdn.net/hailingling/article/details/84155564?ops_request_misc=&request_id=7804774d7d3e497f8fcace531f3907e4&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~all~koosearch~default-3-84155564-null-null.142^v88^insert_down28v1,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96

本文章网址:https://www.sjxi.cn/detil/2133dedf81854262abcf96724a860efa

最新评论

当前未登陆哦
登陆后才可评论哦

湘ICP备2021009447号

×

(穷逼博主)在线接单

QQ: 1164453243

邮箱: abcdsjx@126.com

前端项目代做
前后端分离
Python 爬虫脚本
Java 后台开发
各种脚本编写
服务器搭建
个人博客搭建
Web 应用开发
Chrome 插件编写
Bug 修复