动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.如何更改 Netbeans 中选项卡的名.
.JAVA TECHNOLOGY EXAM OBJECTIVES.
.Java线程的讨论与应用.
.解决JAVA服务器性能问题研究分析.
.复制文件夹内容和删除整个文件夹.
.一步一步教你用JS和INF编辑注册表.
.J2EE中的异常管理及错误跟踪框架.
.通过开发一个STRUTS项目的体会.
.Effective java学习笔记6:避免使.
.在Jboss下Web Service调用EJB一.
.用Eclipse3.0+jboss4Lomboz 3开发.
.Hibernate事务处理机制.
.避免使用finalizer()函数.
.Java模式学习一、简单工厂.
.Hibernate:HQL/QBC查询语言比较的.
.JAVA基础知识精华总结.
.MVC模式和java web application.
.Java实时应用程序中的内存管理.
.sub 方法.
.Sun Blade和Java工作站领跑传统工.

你知道数据大小吗?

发表日期:2008-1-5 |



  --不要花太多的功夫来隐藏类的成员(三)
  
  你知道数据大小吗?--不要花太多的功夫来隐藏类的成员(三)  copyright(翻译)
   
  要害字   数据大小 对象大小 堆空间
   
  出处   http://www.Javaworld.com/javaworld/javatips/jw-javatip130-p3.Html
   
  我们能做点什么呢?
  
  “这很好,但是我们没有任何选择除了使用String和其它Java提供的类型,是不是这样呢?”我听到你们再问,那么让我们来找找答案吧。
  
  l     封装类
  
  封装类比如java.lang.Integer,看起来保存大量的数据在内存中像一个坏的选择。假如你尽力为了内存的经济,那么就要避免这么做。使用你自己的针对int的向量类并不难。当然,假如Java的核心函数库已经包含了这个那就最好不过了。或许这种情况在Java拥有非凡类型的时候将会大大改观。
  
  l     多位数组
  
  对于使用多维数组的大型的数据结构,你可以时常的通过简单的索引变换减少额外的维数/例如:转换int[dim1][dim2]的实例到一个int[dim1*dim2]的实例,改变所有形如a[i][j]的表达式为a[i*dim1+j]。这样你就不必花功夫在dim1上的索引检查可以提高效率。
  
  l     java.lang.String
  
  你可以使用一些小技巧去减少你的应用中字符串的静态内存大小。
  
  首先,你可以尝试一种很平常的技术,就是当一个应用从一个数据文件或者网络连接中载入或者缓存很多的字符串,并且这种字符串的值是有限变化的。举个例子:假如你想分析一个XML文件,在这个文件中,你经常碰到某种属性,但是这个属性仅仅被限制在两个可能的值。你的目标:通过一个散列映射过滤所有的字符串,减少所有相同的但是明显字符串和目标对象引用一样的。
  
    public String internString (String s)
    {
      if (s == null) return null;
      String is = (String) m_strings.get (s);
      if (is != null)
        return is;
      else
      {
        m_strings.put (s, s);
        return s;
      }
    }
  
    private Map m_strings = new HashMap ();
  
  假如适用成功,这个技巧能够成倍的减少你的静态内存需求。一个富有经验的读者应该能够观察到这个技巧复制java.lang.String.intern()的功能性。有无数的理由存在来让你避免使用String.intern()方法。其中一个就是现在的JVM几乎没有能实现大量数据的保留。
  
  假如你的字符串是完全不同的,会发生什么情况呢?这就是要介绍的第二个技巧,重新收集那些小的字符串空间,这些空间潜在的隐藏于char数组中,因为使用数组大概只占了字符串封装所占用的内存的一半。因此,当我们的应用缓存许多独特的字符传值,我们仅仅只要保持在内存中的数组,在需要的时候转换为字符串。假如这个字符串只是作为暂时的,很快就会抛弃,这将很有效果。一个简单的实验就是从一个字典文件中选出作为缓存的90000个单词,这些数据大约5.6M的大小,假如是char的话,只需要3.4M的空间,只占用了以前的65%。
  
  第二个技巧明显的包含一个不利条件,就是你不能支持通过一个构造函数转换一个char[]成为字符串,因为这个构造函数没有复制这个数组而将拥有这个数组。为什么呢?因为这个完全的public的字符串API确保每一个字符串是不可变的,所以每个字符串的构造函数显然要复制输入的数据然后传入它的参数。
  
  然后,我们将使用第三个技巧。这个技巧用在当转换一个char数组为一个字符串的代价证实太高的时候。该技巧使用java.lang.String.substr()的功能避免数据复制:这个方法的是显示用了字符串的不变性,并且创建的一个影子字符串对象来共享字符内容,但是它的内部的开始位置和结束位置都是正确的。我们还是写一个例子,new String(“smiles”).substring(1,5)是一个字符串,这个字符串是字符缓冲从位置1到位置4的字符结束,并且这个字符缓冲将共享原来的字符串构造函数指向的字符缓冲。你可以象一下这样使用:给出一个大的字符串集合,你可以合并它的字符内容到一个大的字符数组,在它之上创建一个字符串,并且使用这个主串的子串来重新创建一个原来的字符串。如以下描述:
    public static String [] compactStrings (String [] strings)
    {
      String [] result = new String [strings.length];
      int offset = 0;
      for (int i = 0; i < strings.length; ++ i)
        offset += strings [i].length ();
      // Can't use StringBuffer due to how it manages capacity
      char [] allchars = new char [offset];
      offset = 0;
      for (int i = 0; i < strings.length; ++ i)
      {
        strings [i].getChars (0, strings [i].length (), allchars, offset);
        offset += strings [i].length ();
      }
      String allstrings = new String (allchars);
      offset = 0;
      for (int i = 0; i < strings.length; ++ i)
        result [i] = allstrings.substring (offset,
                         offset += strings [i].length ());
      return result;
    }
  
  以上方法返回一个新的字符串集等同于输入的字符串集,但是在内存中更加得紧凑。重新获得每个字符串数组的16个字节的头部,在方法中被有效的移除。这个存储在缓存压缩大多数短的字符串时比较有效果。当这个方法用于同样的90000个单词的字典时,内存从5.6M节约到4.2M,大概节约了30%。
  
  l     这些努力是否值得呢?
  我这里提到的方法看起来都是很细微的优化,是否值得花时间去实现呢?但是,记住我们脑子里面应该记住:服务端的应用程序能够缓存大量的数据在内存中的话讲能够大大的提高从磁盘和数据库提取数据的性能和效率。在当前32位的JVM中,几百兆的缓存数据代表堆中很引人注重的位置。减少30%或者更多不应该被嘲笑,它能将系统的可测性质中能提高很显著的水平。当然这些技巧不适用于一开始就很好设计的数据结构,事实的决定要由hotspots来决定。无论如何,你现在应该更加了解你的对象消耗了多少内存。
  
  关于作者:
  Vladimir RouBTsov拥有超过12年的多种语言的编程经验,其中包括从1995年就开始用得Java。目前,它作为资深开发者在Austin, Texas.为Trilogy开发企业级软件。平时的业余爱好就是开发一些关于Java字节代码或源程序代码的工具。
上一篇:类的基本组成 人气:489
下一篇:在Java中实现回调过程 人气:990
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号