您的位置:首页 > 编程语言 > Java开发

java减少内存使用详解

2011-10-21 19:25 721 查看
java中我们使用虚拟机,有了java虚拟机,我们程序员是不用去管理内存的,但是java虚拟机管理内存没有想象的那么好,所以我们在代码里面还是要注意,写出优质的代码, 必定会有不少人站出来为Java辩白,并举出一堆的性能测试述说来证明这一点。其实从实际上来讲Java做的系统并不比其他谈话斥地进去的系统更占用内存,那么为什么却有这么多出处来证明它切当占内存呢?两个字,成规。

别用newBoolean

很多场景中Boolean范例是必需的好比JDBC中boolean范例的set与get都是经由过程Boolean封装传送的大部分ORM也是用Boolean来封装boolean范例的好比:

以下是引用片断:

 ps.setBoolean(“isClosed”,new Boolean(true));
 ps.setBoolean(“isClosed”,new Boolean(isClosed));
 ps.setBoolean(“isClosed”,new Boolean(i==3));


这是相当耗费内存的Boolean类实际上只要软件 href="http://www.csdnjava.com/forum.php">软件两个实例就够了一个true实例,凡这些系统中构造的Boolean实例的个数技术
href="http://www.csdnjava.com/forum.php">技术是相当多的所以系统中充满了大批Boolean实例小对象。一个fals实例。

Boolean类提供两了个静态变量:

以下是引用片断:

 public static final Boolean TRUE = new Boolean(true);
  public static final Boolean FALSE = new Boolean(false);
  因为valueOf的内部实现是:return (b ? TRUE : FALSE);


所以可以或许撙节大批量内存。信赖若是Java尺度直接把Boolean构造函数规定成privat就再也不会出现这种环境了:

下面介绍9种注意事项:

1:connection及时封闭 ,保证每个IO操纵。

2:别用newInteger

java中使用Integer封装int场合也非常 多,和Boolean近似。并且凡用int默示的数值凡都非常小。SUNSDK中对Integer实java href="http://www.csdnjava.com/forum.php">java例化进行了优化,Integer类缓存了-128127这256个状态的Integer如果利用
Integer.valueOfinti传入的int范围恰好在此内,就返回动静实例。这样若是我利用Integer.valueOf取代newInteger话也将大大降低内存的占用。如果您的系统要在分歧的SDK好比IBMSDK中使用的话,那么可以或许自己做了工具类封装一下,好比IntegerUtils.valueOf这样就可以在任何SDK中都可以或许操纵这种特征。

3:用StringBuff庖代字符串相加。

看国内某“闻名”java开辟的WEB体系的源码中,这个我就不多讲了因为已经被 人讲过N次了只想将一个不是笑话的笑话。竟然发现其中大批的操纵字符串相加,一个拼装SQL语句的体式格局中竟然最多构造了快要100个string实例。无语中!

4:过滥操纵哈希表

从而前进体系的运行速率。比如利用HashMap缓存一些物料信息、人员动静等基础资料,有必定斥地教训的斥地人员经常会使用hash表(hash表在JDK中的一个实现就是HashMap来缓存一些数据。这 前进系统速率的同时也加大了体系的内存占用,出格是当缓存的资料斗劲多的时辰。实在我可以或许操纵把持系统中的缓存的概念来处置惩罚这个成绩,也就是给被缓存的分配一个一定大小的缓存容器,按照必然的算法淘汰不必要担当缓存的工具,这样一方面会因为进行了对象缓存而提高了体系的运行效力,同时由于缓存容器不是无限制扩大,从而也减少了体系的内存占用。现在有很多开源的缓存实现项目,好比ehcachoscach等,这些项目都实现了FIFOMRU等常见程序员
href="http://www.csdnjava.com/forum.php">程序员的缓存算法。

5:预防过深的类品位结构和过深的体式格局挪用。

因为这两者都是非常占用内存的出格是体式格局调用更是堆栈空间的耗费小户)

变量只要在用到时刻才定义和实例化。

类内私有常量可以用final来代替。7尽量预防利用static变量。

对频繁使用的对象采用对象池技术

通过以上的实例,我们可以减少很多的内存,大家赶紧试试吧。

转载自:http://www.csdnjava.com/forum.php?mod=viewthread&tid=560&extra=page%3D1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: