Java内存管理的9个小技巧


  很多人都说“java完了, 只等着衰亡吧!”, 为什么呢?最复杂的的例子就是java做的系统时非常占内存!一听到这样的话, 一定会有不少人站出来为java辩护, 并举出一堆的功能测试报告来证明这一点。 其实从实际下去讲java做的系统并不比其他语言开收回来的系统更占用内存, 那么为什么却有这么多理由来证明它确实占内存呢?两个字, 陋习。

  1、别用newboolean()。

  在很多场景中boolean类型是必须的, 比方jdbc中boolean类型的set与get都是通过boolean封装传递的, 大局部orm也是用boolean来封装boolean类型的, 比方:

  以下是援用片段:

  ps. setboolean("isclosed", newboolean(true));

  ps. setboolean("isclosed", newboolean(isclosed));

  JAVAps. setboolean("isclosed", newboolean(i==3));

  通常这些系统中构造的boolean实例的个数是相当多的, 所以系统中充满了大量boolean实例小对象, 这是相当消耗内存的。 boolean类实际上只需两个实例就够了, 一个true的实例, 一个false的实例。

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

  以下是援用片段:

  publicstaticfinalbooleantrue=newboolean(true);

  publicstaticfinalbooleanfalse=newboolean(false);

  因为valueof的外部完成是:return(b?true:false);

  所以可以节省大量内存。 置信假设java规范直接把boolean的构造函数规则成private, 就再也不会出现这种状况了。

  2、别用newinteger。

  和boolean相似, 诺依曼记忆枕 java开发中使用integer封装int的场合也非常多, 并且通常用int表示的数值通常都非常小。 sunsdk中对integer的实例化停止了优化, integer类缓存了-128到127这256个状态的integer, 假设使用integer. valueof(inti), 传入的int范围正好在此内, 就前往静态实例。 这样假设我们使用integer. valueof替代newinteger的话也将大大降低内存的占用。 假设您的系统要在不同的sdk(比方ibmsdk)中使用的话, 那么可以自己做了工具类封装一下, 比方integerutils. valueof(), 这样就可以在任何sdk中都可以使用这种特性。

  3、用stringbuffer替代字符串相加。

  这个我就不多讲了, 因为曾经被人讲过n次了。 我只想将一个不是笑话的笑话, 我在看国际某“着名”java开发的web系统的源码中, 居然发现其中大量的使用字符串相加, 一个拼装sql语句的方法中居然最多构造了将近100个string实例。 无语中!

  4、过滥使用哈希表

  有一定开发经历的开发人员常常会使用hash表(hash表在jdk中的一个完成就是hashmap)来缓存一些数据, 从而进步系统的运行速度。 比方使用hashmap缓存一些物料信息、人员信息等基础资料, 这在进步系统速度的同时也加大了系统的内存占用, 特别是当缓存的资料比较多的时分。 其实我们可以使用操作系统中的缓存的概念来解决这个效果, 也就是给被缓存的分配一个一定大小的缓存容器, 按照一定的算法淘汰不需要继续缓存的对象, 这样一方面会因为停止了对象缓存而进步了系统的运行效率, 同时由于缓存容器不是有限制扩大, 从而也增加了系统的内存占用。 现在有很多开源的缓存完成项目, 比方ehcache、oscache等, 这些项目都完成了fifo、mru等罕见的缓存算法。

  5、防止过深的类层次构造和过深的方法调用。

  因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)。

  6、变量只有在用到它的时分才定义和实例化。

  7、尽量防止使用static变量, 类内私有常量可以用final来替代。

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

  9、保证每个io操作, connection及时封锁

你可能感兴趣的:(java内存管理)