关闭

Java编程时如何节省内存,效率高

711人阅读 评论(0) 收藏 举报
很多人都说“Java完了,只等着衰亡吧!”,为什么呢?最简单的的例子就是Java做的系统时非常占内存!一听到这样的话,一定会有不少人站出来为Java辩护,并举出一堆的性能测试报告来证明这一点。其实从理论上来讲Java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么多理由来证明它确实占内存呢?两个字,陋习。

1、别用new Boolean()。

在很多场景中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实例的个数是相当多的,所以系统中充满了大量Boolean实例小对象,这是相当消耗内存的。Boolean类实际上只要两个实例就够了,一个true的实例,一个false的实例。

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

以下是引用片段:

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

因为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缓存一些物料信息、人员信息等基础资料,这 在提高系统速度的同时也加大了系统的内存占用,特别是当缓存的资料比较多的时候。其实我们可以使用操作系统中的缓存的概念来解决这个问题,也就是给被缓存的分配一个一定大小的缓存容器,按照一定的算法淘汰不需要继续缓存的对象,这样一方面会因为进行了对象缓存而提高了系统的运行效率,同时由于缓存容器不是无限制扩大,从而也减少了系统的内存占用。现在有很多开源的缓存实现项目,比如ehcache、oscache等,这些项目都实现了FIFO、MRU等常见的缓存算法。

5、避免过深的类层次结构和过深的方法调用。

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

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

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

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

9、保证每个IO操作,connection及时关闭

注明:QQ技术交流群:108614806   感兴趣的加一下。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Java编程时如何节省内存,效率高

很多人都说“Java完了,只等着衰亡吧!”,为什么呢?最简单的的例子就是Java做的系统时非常占内存!一听到这样的话,一定会有不少人站出来为Java辩护,并举出一堆的性能测试报告来证明这一点。其实从理...
  • wwsscc168
  • wwsscc168
  • 2016-03-09 14:39
  • 178

Redis内存节省策略

Redis作为一款缓存软件,在Redis的源码中,处处体现着节省内存的思想,下面将从3个方面对Redis的内存节省策略做一个分享。(以下代码为Redis 3.0.5版本)       1.redisO...
  • codingWen
  • codingWen
  • 2016-01-20 21:57
  • 245

ANDROID内存优化(大汇总——全)

ANDROID内存优化大汇总完全版,涵盖内存介绍,内存计算,减少内存,重用内存,回收内存等内存优化总结。
  • a396901990
  • a396901990
  • 2014-09-11 00:17
  • 25940

嵌入式:节省内存的软件设计技巧

本文讲述内存资源紧缺型嵌入式系统中节省内存的软件设计方法。一般主控是单片机控制器的电子产品的成本跟内存的关系可是成正比的,尤其在SOC芯片设计时是固件开发需要重点关注的。大量量产前要确定内置SRAM的...
  • yueqian_scut
  • yueqian_scut
  • 2014-04-22 09:59
  • 2981

关于书上说的“编译的时候分配内存”

一下均为网络上收集的资料:   1、所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以 明确计...
  • u012569119
  • u012569119
  • 2015-09-03 21:41
  • 1005

优化布局在Android–减少过度渲染

通过查看GPU透支来改善应用程序的渲染时间。What is Overdraw? Overdraw happens every time the application asks the syste...
  • u013278099
  • u013278099
  • 2016-02-16 09:59
  • 1212

节省你的内存

我刚开始接触手机开发的时候,一昧地认为让程序跑的越快就越好,完全忽略内存是否够不够用,而事实上,手机的CPU速度总是比我们想象的要快,而内存的容量总是比我们想象的要少。忽略内存的使用情况有时候好比一条...
  • ixiaobu
  • ixiaobu
  • 2013-04-29 17:49
  • 1583

Bitmap——在不改变大小的情况下,如何以最省内存的方式读取本地资源的图片

转自http://blog.csdn.net/cw2004100021124/article/details/38897093 /** * 以最省内存的方式读取本地资源的图片 * @param c...
  • chuntiandejiaobu10
  • chuntiandejiaobu10
  • 2016-08-12 10:22
  • 649

编译型语言,解释型语言和脚本语言的对比

1 三种类型的定义:     编译型语言:C,C++。编译后成为机器语言,以后执行的时候就不需要编译了,     解释型语言;JAVA,C#。在运行的时候将程序翻译为机器语言,虽然Java程序在运...
  • qizhiqq
  • qizhiqq
  • 2016-07-08 11:58
  • 552

自动装箱/卸箱

自动装箱——autoboxing,在JDK1.5中首次发表,指将一个基本类型变量,如:   int x=5;   直接、自动地装入代表它的包装类,如Integer对象中,而不必经过传统的方法调用,...
  • u010708434
  • u010708434
  • 2013-08-25 00:25
  • 454
    支付宝和拼多多
      如果我的文章对你有用的话,请大家支持下,请做一件对你我都有意义的事情,扫下面的二维码吧。支付宝,拼多多
    博客公告
    本博客所有文章只是沈阳斌子在开发过程中遇到的问题的一个积累,有些东西也是网上大家的,我只是做个技术上的积累,欢迎交流,欢迎转载;禁止用于商业目的,谢谢合作!----沈阳斌子
    个人资料
    • 访问:512065次
    • 积分:6789
    • 等级:
    • 排名:第4021名
    • 原创:144篇
    • 转载:52篇
    • 译文:0篇
    • 评论:134条
    联系方式
    QQ技术交流群:
    108614806(1000人群,未满)

    博客专栏
    最新评论