Java做的系统给人的形象是什么?占内存!说道这句话就会有N多人站出来为java辩解,并举出一堆的功用测试报告来证明这一点。
  其实从理论上来讲java做的系统并不比其他言语开发出来的系统更占用内存,那么为什么却有这么N多理由来证明它确实占内存呢?两个字,陋俗。
  (1)别用new Boolean()。
  在许多场景中Boolean类型是有必要的,比如JDBC中boolean类型的set与get都是通过Boolean封装传递的(ohyeap),大部分ORM也是用Boolean来封装boolean类型的,比如:
  ps.setBoolean("isClosed",new Boolean(true));
  ps.setBoolean("isClosed",new Boolean(isClosed));
  ps.setBoolean("isClosed",new Boolean(i==3));
  一般这些系统中结构的Boolean实例的个数是恰当多的,所以系统中充满了许多Boolean实例小方针,这是恰当消耗内存的。Boolean类实际上只需两个实例就够了,一个true的实例,一个false的实例。
  Boolean类供给两了个静态变量:
  public static final Boolean TRUE = new Boolean(true);
  public static final Boolean FALSE = new Boolean(false);
  需求的时分只需取这两个变量就能够了,
  比如:
  ps.setBoolean("isClosed",Boolean.TRUE);
  那么象2、3句那样要根据一个boolean变量来创立一个Boolean怎么办呢?能够运用Boolean供给的静态办法: Boolean.valueOf()
  比如:
  ps.setBoolean("isClosed",Boolean.valueOf(isClosed));
  ps.setBoolean("isClosed",Boolean.valueOf(i==3));
  因为valueOf的内部结束是:return (b ? TRUE : FALSE);
  所以能够节约许多内存。信赖假定Java规范直接把Boolean的结构函数规矩成private,就再也不会出现这种情况了。
  (2)别用new Integer。
  和Boolean相似,java开发中运用Integer封装int的场合也非常 多,并且一般用int标明的数值一般都非常小。SUN SDK中对Integer的实例化进行了优化,Integer类缓存了-128到127这256个情况的Integer,假定运用 Integer.valueOf(int i),传入的int范围正好在此内,就回来静态实例。这样假定我们运用Integer.valueOf替代new Integer的话也将大大下降内存的占用。假定您的系统要在不同的SDK(比如IBM SDK)中运用的话,那么能够自己做了东西类封装一下,比如IntegerUtils.valueOf(),这样就能够在任何SDK中都能够运用这种特性。
  (3)用StringBuffer替代字符串相加。
  这个我就不多讲了,因为现已被 人讲过N次了。我只想将一个不是笑话的笑话,我在看国内某“出名”java开发的WEB系统的源码中,居然发现其间许多的运用字符串相加,一个组装SQL 句子的办法中居然最多结构了将近100个string实例。无语中!
  (4)过滥运用哈希表
  有必定开发经历的开发人员经常会运用hash表(hash 表在JDK中的一个结束就是HashMap)来缓存一些数据,然后跋涉系统的作业速度。比如运用HashMap缓存一些物料信息、人员信息等根底材料(okeLektrik),这 在跋涉系统速度的一同也加大了系统的内存占用,特别是当缓存的材料比较多的时分。其实我们能够运用操作系统中的缓存的概念来处理这个问题,也就是给被缓存 的分配一个必定巨细的缓存容器,依照必定的算法挑选不需求持续缓存的方针,这样一方面会因为进行了方针缓存而跋涉了系统的作业功率,一同因为缓存容器不是无限制扩展,然后也减少了系统的内存占用。现在有许多开源的缓存结束项目,比如ehcache、oscache等,这些项目都结束了FIFO、MRU等常见的缓存算法。
  (5)避免过深的类层次结构和过深的办法调用。
  因为这两者都是非常占用内存的(特别是办法调用更是库房空间的消耗大户)。
  (6)变量只需在用到它的时分才界说和实例化。
  (7)尽量避免运用static变量,类内私有常量能够用final来替代。