免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1007 | 回复: 0
打印 上一主题 下一主题

java 代码优化 转 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-04 12:07 |只看该作者 |倒序浏览
本人对于第二条  觉得还可以更优化


Java程序中的内存管理机制是通过GC完成的,“一个对象创建后被放置在JVM的堆内存中,当永远不在应用这个对象的时候将会被JVM在堆内存中回收。被创建的对象不能再生,同时也没有办法通过程序语句释放”(这个是《Java的GC机制》中提到的定义,呵呵,还依稀记得)这就是GC对垃圾对象的定义。个人感觉这么解释或许会比较快理解:在运行环境中JVM会对两种内存进行管理,一种是堆内存(对象实例或者变量),一种是栈内存(静态或非静态方法),而JVM所管理的内存区域实际上就是堆内存+栈内存(MS:对象实例+实例化变量+静态方法+非静态方法),当JVM在其所管理的内存区域的中无法通过根集合到达对象的时候就会将此对象作为垃圾对象实施回收。
下面是我在项目中对代码进行优化的几点尝试,备忘
1.循环优化
缺:

List alist=uSvr.getUserinfoList();


          for(int i=0;ialist.size();i++){



}此种方式会一直去执行alist.size()方法,带来性能消耗,改为

for(int i=0 p=alist.size();ip;i++){

   


}
2.循环内不要创建对象
缺;


for(int i=1;idomainCount;i++)

{

        

.            

AuditResult auditResult = new AuditResult();

               

..

}
这种做法会在内存中保存N份这个对象的引用//会浪费大量的内存空间,改为


AuditResult auditResult;


for(int i=1;idomainCount;i++)

{

        

.            

auditResult=new AuditResult();

               

..

}
3.  什么样的对象可以将其认定为不可视阶段呢?举个例子吧,在try{...}catch(Exception){...}代码中,如果在try的代码块中声明了一个obj,那么当整个 try{...}catch(Exception){...}代码段执行完毕以后这个obj实际上就已经属于不可视阶段了。
所以,应该采用如下方式


try

{

   


   Object obj=new Object();


}catch(Excepione e)

{

obj=null;

}
4.少用new创建对象
用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。
缺:
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:

public static Credit getNewCredit()


  

{

     return new Credit();


  }


改为

private static Credit BaseCredit = new Credit();


  public static Credit getNewCredit()  

{

   return (Credit) BaseCredit.clone();

  }


当new创建对象不可避免时,注意避免多次的使用new初始化一个对象。 尽量在使用时再创建该对象。
缺:

NewObject object = new NewObject();

int value;

if(i>0 )



{

 value =object.getValue();

}
改为

int value;

if(i>0 )



{

 NewObject object = new NewObject();

 Value =object.getValue();

}


5.乘法和除法考虑
缺:


 for (val = 0; val  100000; val +=5)

{

   alterX = val * 8;

   myResult = val * 2;

  }

改为:


for (val = 0; val  100000; val += 5)

{

   alterX = val  3;

   myResult = val  1;

  }
6.尽量多的使用stringbuffer
7清除Session
  通常情况,当达到设定的超时时间时,同时有些Session没有了活动,服务器会释放这些没有活动的Session,.. 不过这种情况下,特别是多用户并访时,系统内存要维护多个的无效Session。
当用户退出时,应该手动释放,回收资源,实现如下:

HttpSession theSession = request.getSession();

// 获取当前Session


if(theSession != null)

{

 theSession.invalidate(); // 使该Session失效

}
NOTE:堆内存是在JVM启动的时候创建,堆内存分为新对象与老对象。对于新对象好像会分三个区域。当优先级最高的区域的堆栈满了以后JVM将会进行测试,测试内容是那些对象不可到达,不可到达的对象将会放入到老对象区域。同时JVM会将所有对象拷贝到另外两个区域中,然后经过一段时间依然没有引用的对象会进入老对象区域。对于老对象区域而言基本上就是等待被GC回收的对象了。(这些还是在大学时学.net时候的知识,直接换成java定义我想其中概念应该一样。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/67067/showart_1104128.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP