首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

java中循环外定义变量与循环内定义变量占用内存与效率有关问题

2013-01-26 
java中循环外定义变量与循环内定义变量占用内存与效率问题?本帖最后由 Inflexible_lin 于 2013-01-15 09:5

java中循环外定义变量与循环内定义变量占用内存与效率问题?
本帖最后由 Inflexible_lin 于 2013-01-15 09:53:29 编辑 当数据量很大时,即内层循环次数达到百万级以上时,是按现在这样定义变量好呢?
还是把变量定义放到图中蓝色部分???
请大师帮忙解答一下,个人觉得是目前这样定义比较好!

Sheet sh = null; //sheet
           Row row0 = null; //每个sheet的标题
           Row row = null;//具体的行变量,避免多次定义
           Cell cell = null;//单元格变量,避免多次定义
           for(int i=0;i< sheet_num;i++){
              sh = wb.createSheet();
              row0 = sh.createRow(0);
              //生成每个sheet的title
              for(int cellNum = 0,colLength =colTitles.length; cellNum < colLength; cellNum ++) {
                 cell = row0.createCell(cellNum);
                 cell.setCellValue(colTitles[cellNum]);
                 cell.setCellStyle(createStyle(wb));
              }
              //每个SHEET有最多100万行数据
              for(int rowNum = 1; rowNum <= maxSheetRowNum; rowNum++) {
              if(!rs.next()){
              break;
              }
              //System.out.println(rowNum);
                 row = sh.createRow(rowNum);
                  for(int cellNum = 0,colLength =colTitles.length; cellNum < colLength; cellNum ++) {
                     cell = row.createCell(cellNum);
                     cell.setCellValue(rs.getString(cellNum + 1));
                  }
                  //每当行数达到设置的值就刷新数据到硬盘,以清理内存
                  if(rowNum % rowAccess == 0){
                     ((SXSSFSheet)sh).flushRows();


                  }
              }
              //最后不足100条时写入
              ((SXSSFSheet)sh).flushRows();
           } java 内存
[解决办法]
我个人也习惯用红色部分,毕竟少了很多次的申请空间,入栈和出栈的操作

不过,自己在编程的时候要注意不让上一次的结果影响到下一次循环

比如上一次 a = 3, 当下一次循环在给a赋值的时候出了错误,而你捕获了错误

缺没修正a的值,程序继续执行,那么这时候a=3还成立,可能就会有问题了,

如果是每次都定义,那就不存在这样的问题。
[解决办法]
循环外好,避免重复分配栈空间。
[解决办法]

引用:
本帖最后由 Inflexible_lin 于 2013-01-15 09:53:29 编辑
            当数据量很大时,即内层循环次数达到百万级以上时,是按现在这样定义变量好呢?
还是把变量定义放到图中蓝色部分???
请大师帮忙解答一下,个人觉得是目前这样定义比较好!

Sheet sh = null; //sheet
           ……

我想这个问题你自己就能回答的。。
这个问题你自己也感觉到了哪个好的。。
有时候放在内部循环是为了条件需要而已。
比如百万调用以后之后还需要在调用一遍百万级的数据,还需要上一次的参数,那这样就只能放在循环内了。
[解决办法]
仅是作用域不一样,栈中的空间在编译这个代码的时候大小就确定下来了,运行这个方法时空间就已经分配好了,不要想当然的以为声明一次就要分配一次空间,那是c语言,java可以重用这些超出作用域的空间

只要用javap查看方法字节码,看看使用的局部变量表的大小和使用方式即知
[解决办法]
java这种基于虚拟机的语言,是跟单纯的C不同,C语言的原则是相信程序员能做好一切,因此它不会帮你做多少事情,需要考虑代码优化,内存占用等。

而java中的原则就是:要写好的代码而不是快的代码
[解决办法]
引用:
引用:java这种基于虚拟机的语言,是跟单纯的C不同,C语言的原则是相信程序员能做好一切,因此它不会帮你做多少事情,需要考虑代码优化,内存占用等。

而java中的原则就是:要写好的代码而不是快的代码

但是有时候,不得不去考虑一些内存优化的问题啊?要考虑到什么时候会内存溢出,才好提前想出现解决方法啊?

java有垃圾回收的,一般情况下不用关注这个,除非有大量的缓存存在,需要考虑管理缓存,不让堆空间过大。。

热点排行
Bad Request.