知识大全 一个开发实际项目中对 Java 性能提高的体会

Posted

篇首语:闲散如酸醋,会软化精神的钙质;勤奋像火炬,能燃起智慧的火焰。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 一个开发实际项目中对 Java 性能提高的体会相关的知识,希望对你有一定的参考价值。

一个开发实际项目中对 Java 性能提高的体会  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在开发的期间 系统在运行的时候出现了一些问题 现将我的问题解决方法做一个小结 供以后作项目的参考 并请大家不吝指教      问题   Resin 的数据库连接数目在程序运行中不断增长 最后连接数目超过最大数 导致Resin服务关闭    原因   在操作完数据库后 没有关闭数据库连接 或者是返回结果集(Resultset) 而无法在jsp中关闭数据库连接     解决方法    . 在操作完数据库要关闭数据库连接    . 尽量不要返回结果集Resultset 可以返回Vector(一个字段) Hashtable(多个字段) 这样可以在javabean中关闭数据库    . 如果javabean中返回的是结果集(Resultset) 也可以在javaBean中写一个connectDB(连接数据库) closeDB(关闭数据库)的方法 然后jsp里面调用connectDB() 建立数据库连接 同时就可以对数据库进行操作了 操作数据库完毕 可以通过closeDB() 来关闭数据库    关闭连接时尽量使用conn close() rs close() 而不要另外写方法去关闭它 如调用DB closeConnection(conn)等等 这样其实对性能有一定影响 因为该性能经过了我对单个文件的测试    关闭连接时请按顺序进行 如rs close() stmt close()nn close()      问题   在运行某一个jsp 程序的时候 Resin 的内存陡然增长 而且居高不下 最终导致Resin 内存不足 甚至当机   原因   过度使用内存     解决方法    . 由于数据量比较大 在对字符串进行操作的时候 使用 + 进行字符串连接 而  相信大家对String都非常熟悉 我们也经常要用它来做字符串的连接什么的 例如   String a =b+c file://b c 都是String  但是在实际的编译中却是这样   String a=new StringBuffer() append(b) append(c) toString() 显然 在一个简单的语句中却意外的多生成了 个对象    StringBuffer()   toString返回的一个String  我们比较一下这两段程序的性能   程序片断一   StringBuffer s=new StringBuffer();  long start = System currentTimeMillis();  for (int i= ;i< ;i++)  s += a ;    long stop = System currentTimeMillis();  System out println(stop start);  程序片断二   StringBuffer s=new StringBuffer( );//  long start=System currentTimeMillis();  for (int i= ;i< ;i++)  s append( a );    long stop=System currentTimeMillis();  System out println(stop start);  比较一下结果 差距很明显   至于为什么String的连接这么做 因为String无法直接改变其长度 而必须采用StringBuffer的用法   因此建议使用StringBuffer 的append 方法来进行字符串相连      .在解决这个问题的时候 我也尝试使用上面的方法 效果并不是很明显(消耗内存上) 后来在显示大量数据的时候 避免字符串相连的步骤 而直接使用out println() 直接输出   问题 Java并不阻止程序占用过多的内存 当对象向堆所请求的内存不足时 垃圾收集器(Garbage Collector)就会自动启动 释放那些引用数为零的对象所占用的内存 Java也不会自动释放无用的对象的引用 如果程序忘记释放指向对象的引用 则程序运行时的内存随着时间的推移而增加 发生所谓内存泄漏(memory leaks) 创建对象不但消耗CPU的时间和内存 同时 为释放对象内存JVM需不停地启动垃圾收集器(Garbage Collector) 这也会消耗大量的CPU时间     解决方法 由于在运行一段时间jsp程序后 Resin 的内存会有一个缓慢的增长 这样也会导致内存溢出 为了避免这总现象的出现 最终的解决方法是 编写一个servlet程序 在启动服务器的时候 启动一个这个servlet 每隔 分钟运行在服务器端运行一次 来定时回收内存      问题   log文件里面的调试信息没有注释去掉   解决方法   在程序通过后 尽量把调试的信息注释去掉   同时在捕捉错误的时候要写明程序名称 方便查找      问题   改善性能 提高速度   具体实例   我们再来看一个有关Vector类的代码片段   for(int I= ; I<v size(); I++) System out println( v get(I) getClass() toString());   如果v包含 个元素 这个代码片段将调用v size()方法 次 虽然size方法是一个简单的方法 但它仍旧需要一次方法调用的开销 至少JVM需要为它配置以及清除堆栈环境 在这里 for循环内部的代码不会以任何方式修改Vector类型对象v的大小 因此上面的代码最好改写成下面这种形式   int size = v size(); for(int I= ; I<size; I++) System out println( v get(I) getClass() toString());   虽然这是一个简单的改动 但它仍旧赢得了性能 毕竟 每一个CPU周期都是宝贵的      问题   在 jsp 文件里面 不要写 <%@ page import= java lang * %>  因为java 不需要引入此包就可以引用里面的类文件      问题   使用vector+hashtable 一次返回查询结果resulset     解决方法 记录集 将一条记录放到一个hashtable里面 然后把它再  添加到vector里面 循环记录下结果集 返回vector  具体见后面的java文件的部分代码(不包扩数据库的连接和关闭)    package pany;    /********************************************  ***** 说明   ***** 记录集 一条记录用放到一个hashtable里面 然后把它再  放到vector里面 循环记录下结果集 返回vector    *********************************************/    import java io *;  import java sql *;  import java util *;  import java text *;    public class hashtable_vector_rs    /* */  /* 函数名称 getMultiRowInfo  /* 功能描述 返回记录集 放到Hashtable里面  /* 参数 sql 语句 字段个数  /* 返回值: 成功 htable 失败 null  /* */  public Vector ListResult(String sqlStatement int num)    Vector ListRs=new Vector();    try    connectDB();  rs=stmt executeQuery(sqlStatement);  //判断字段数据类型  //date型 返回   //int型 返回   //bigint型 返回   //String型 返回   //(char 型)返回   int t = ;  rsmd = rs getMetaData();  int ColumnCount= ;  if(num> )  ColumnCount = num;  else  ColumnCount = rsmd getColumnCount();  while(rs next())    Hashtable htable =new Hashtable();  for (int i = ; i <= ColumnCount; i++)    t=rsmd getColumnType(i);  System out println( i= +i+ t= +t+ name= +rsmd getColumnName(i));  if(t== ||t== ||t== )    if(rs getString(i)==null|| rs getString(i) equals( ))  htable put(rsmd getColumnName(i) );  else  htable put(rsmd getColumnName(i) rs getString(i));    else if(t== )    htable put(rsmd getColumnName(i) rs getDate(i) toString());    else if(t== ||t== )    htable put(rsmd getColumnName(i) Integer toString(rs getInt(i)));      ListRs add(htable);  //e  return ListRs;    catch(Exception listError)    System out println( 数据库操作失败! +listError);  return null;    finally    try    closeDB();    catch(Exception closeErr)    System out println( 关闭数据库出错 +closeErr);             问题 :   jsp的程序也有设计的不够合理的地方  例如 选择一个下拉框 提交一次 列出所选的数据 选择另外一个下拉框再次提交 再次列出所选的数据   解决方法   尽量一次把条件选择完毕 然后列出所选择的数据 并且在数据多的时候 尽量使用翻页 减少运行时间      问题   性能优化 尽量使用PreparedStatement  解决方法   PreparedStatement 对象和使用的普通的 Statement 对象有两点不同   第一 它们是为了性能更快而由 JDBC 驱动程序或数据库编译(预编译)的   第二 它们接受一个或多个动态输入参数 称为 IN 参数 这两点让 PreparedStatement 对象适用于重复的 SQL 操作 其中操作基本上都是一样的 只有微小的差异(如数据载入) 要让 SQL 语句在使用前预备好 在 PreparedStatement 对象创建时必须将 SQL 传送到 JDBC 驱动程序 而不是在其执行时才传送     IN 参数用 SQL String 中的 ? 占位符表示 在 PreparedStatement 能够成功地执行前 还必须调用 PreparedStatement 对象的 se cha138/Article/program/Java/gj/201311/27504

相关参考

知识大全 java性能优化-之三

  Java使得复杂应用的开发变得相对简单毫无疑问它的这种易用性对Java的大范围流行功不可没然而这种易用性实际上是一把双刃剑一个设计良好的Java程序性能表现往往不如一个同样设计良好的C++程序在J

土地增值税清算过程中对商住一体项目如何计算土地增值税?

我公司开发一小区,小区中有临街一、二层为商业用房,二层以上为住宅用房,总有21层的商住一体房屋一栋。在土地增值税清算过程中,按照《国家税务总局关于房地产开发企业土地增值税清算管理有关问题的通知》国税发

知识大全 高性能Java设计与开发

高性能Java设计与开发  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!     ——JDBC篇(一

知识大全 使用 ANT 协助高效开发 java 项目

使用ANT协助高效开发java项目  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ANT是Apa

知识大全 Eclipse插件开发中的Java项目模型

Eclipse插件开发中的Java项目模型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Jav

知识大全 Flex和Java快速开发的Flamingo项目

Flex和Java快速开发的Flamingo项目  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 进行Java Web项目开发需要掌握的技术

进行JavaWeb项目开发需要掌握的技术  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java

知识大全 JAVA开放源码项目与工具在企业应用开发中的运用

JAVA开放源码项目与工具在企业应用开发中的运用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java Web开发Tomcat中三种部署项目的方法

JavaWeb开发Tomcat中三种部署项目的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Java中对线程间的变量访问也需要同步控制

Java中对线程间的变量访问也需要同步控制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一个简