很多人都说“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   感兴趣的加一下。

java克隆 是否节省内存_Java编程时如何节省内存,效率高相关推荐

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

    很多人都说"Java完了,只等着衰亡吧!",为什么呢?最简单的的例子就是Java做的系统时非常占内存!一听到这样的话,一定会有不少人站出来为Java辩护,并举出一堆的性能测试报告来 ...

  2. java编程 内存_Java编程技术之浅析JVM内存

    JVM JVM->Java Virtual Machine:Java虚拟机,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 基本认知: ...

  3. java执行内存_java运行时内存

    运行时数据区域 java运行时数据区域主要分为下面几个: 方法区 虚拟机栈 本地方法栈 堆 程序计数器 java运行时数据区域.jpg 程序计数器 它是一块较小的内存空间,可以看做是当前线程所指定的字 ...

  4. java 指定 内存_java 运行时指定内存大小

    java -jar -Xms1024m -Xmx1536m -XX:PermSize=128M -XX:MaxPermSize=256M XXX.jar java  -Xms128M -Xmx512M ...

  5. java堆和非堆_java 堆与非堆 内存

    堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的.&q ...

  6. java 打印一棵树_java编程题之从上往下打印出二叉树

    本文实例为大家分享了java从上往下打印出二叉树的具体代码,供大家参考,具体内容如下 import java.util.ArrayList; import java.util.Stack; /** * ...

  7. java好学还是ui好学_java编程和ui设计哪个好学?

    Java语言完全满足了PC的条件,在减少内存,直接在各类电子产品中运行,在网络中可被任何设备所识别,充分利用网络资源等方面有所突破创新,为PC时代的发展创造了有力条件. 随着IT产业的发展,许多企业中 ...

  8. java最全基础知识_Java编程入门,计数排序(Counting Sort)怎么做?

    计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中. 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数. 计数排序(Counting sort)是一种稳定的排 ...

  9. java最全基础知识_Java编程入门,选择排序(Selection Sort)怎么做?

    表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧.理论上讲,选择排序可能也是平时排序一般人想到的 ...

最新文章

  1. java string出现次数_Java String方法获取字符出现次数及字符最大相同部分示例
  2. 请求包含(Include)和请求转发(Forward)
  3. 王凯1987计算机系,计算机科学与技术系王凯:付出总有回报
  4. 搭载鸿蒙系统的手机是怎样操作的,华为官方:鸿蒙系统2.0上线,手机能否搭载鸿蒙操作系统?...
  5. php 清除指定session,PHP如何操作指定的session?
  6. Netty工作笔记0040---Netty入门--服务端1
  7. 获取Android Studio的Sha1
  8. 素数问题练习_HDOJ1262
  9. 【数据结构】线性表的链式存储结构
  10. 内置RTK北斗高精度定位的智能安全帽完成调试,上报至smarteye平台
  11. 微分方程模型——偏微分方程
  12. mysql 免安装 密码_mysql免安装版配置与修改密码
  13. 向量的数量函数的导数
  14. 码出未来:我与计算机的爱恨情仇
  15. 软件项目经理应具备的素质和条件_软件项目经理素质能力的必备要求
  16. 如何找回回收站清空的文件
  17. Python开发, 恶意病毒扫描
  18. Win32游戏制作之---Bizzard
  19. PostgreSQL练习
  20. 红外光波长对血氧饱和度的影响

热门文章

  1. [附源码]SSM计算机毕业设计公务员报名JAVA
  2. Spark3000门徒第14课spark RDD解密总结
  3. 搞死SAP系统系列 让系统无法登录(二)
  4. 索引推荐神器Paw Index Advisor使用手册(2)-语法支持
  5. 商品配送服务核销水票水站桶装水系统开发
  6. ToDesk(远程协助软件)官方中文版V2.1.5 | todesk远程软件下载
  7. 蓝牙 宽带通话 (wide band speech)WBS 剖析(一) -- profile层
  8. 数理逻辑:证明与反驳
  9. HTTP userAgent 获取客户端访问途径:手机,pc,微信.....
  10. python闹钟界面源码_Python GUI 教程 25行代码写一个小闹钟