java做的系统给人的印象是什么?占内存!说道这句话就会有N多人站出来为java辩护,并举出一堆的性能测试报告来证明这一点。其实从理论上来讲java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么N多理由来证明它确实占内存呢?两个字,陋习。\r\n\r\n(1)别用new Boolean()。\r\n 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与ge
许多人认为使用Java开发的系统占用内存较多,这一观点常常引发争议。支持者会引用大量性能测试报告来反驳这一说法。然而,从理论上讲,Java系统的内存占用并不必然比其他语言更高。造成这种印象的原因,关键在于一些不当的使用习惯。
new Boolean()
在需要布尔值时,许多开发者直接使用new Boolean()
,这会生成多个Boolean对象,导致内存浪费。例如,以下代码生成了过多的Boolean实例:
ps.setBoolean("isClosed", new Boolean(true));
ps.setBoolean("isClosed", new Boolean(isClosed));
ps.setBoolean("isClosed", new Boolean(i == 3));
实际上,Boolean类只需要两个实例:Boolean.TRUE
和 Boolean.FALSE
。推荐使用:
ps.setBoolean("isClosed", Boolean.TRUE);
对于动态布尔值,可以使用Boolean.valueOf()
,该方法会复用已有实例,节省内存:
ps.setBoolean("isClosed", Boolean.valueOf(isClosed));
ps.setBoolean("isClosed", Boolean.valueOf(i == 3));
new Integer()
类似于布尔类型,Integer的实例化也应避免使用new Integer()
,而是使用Integer.valueOf()
,该方法缓存了-128到127范围内的Integer对象同样可以减少内存占用。
StringBuffer
进行字符串拼接字符串的拼接如果使用“+”操作符,会创建很多临时的String对象,极大浪费内存。使用StringBuffer
或StringBuilder
可以有效解决这个问题。
HashMap等哈希表的过度使用会导致内存占用增加。我们可以实施缓存策略,通过设定大小限制,控制缓存内容的生命周期,避免无用数据占用内存。可以使用开源缓存框架如ehcache、oscache来实现这一功能。
过深的类层次结构和多层方法调用不仅影响可读性,也会占用更多的内存。应尽量保持结构的扁平化。
变量应在用到时再定义与实例化,以避免不必要的内存占用。
static
变量的使用尽量避免使用static
变量,类内常量可使用final
修饰。
Java的一大优点是内存管理由垃圾收集器(GC)自动完成,程序员不需明确释放内存。
在Java中,通过new
关键字为对象分配内存,GC负责检测并回收不再被引用的对象,简化了开发人员的工作。
Java使用有向图表示内存管理,将对象视为图中的顶点,引用关系作为有向边。GC只回收与根节点不可达的对象,使其内存管理精确,但效率较低。
Java也存在内存泄漏问题,主要由无用对象的引用导致。开发者应及时清除这些引用,例如设置对象为null
或从集合中移除它们。
可使用各种工具监测内存使用情况,如Optimizeit Profiler、JProbe Profiler等,帮助识别内存泄露。
软引用可以在内存不足时回收,从而平衡内存使用与性能。
finalize
方法,降低GC的工作量。来源:CSDN博客
本站为非盈利网站,如果您喜欢这篇文章,欢迎支持我们继续运营!
本站主要用于日常笔记的记录和生活日志。本站不保证所有内容信息可靠!(大多数文章属于搬运!)如有版权问题,请联系我立即删除:“abcdsjx@126.com”。
QQ: 1164453243
邮箱: abcdsjx@126.com