我们知道掌握Java的内存回收、垃圾回收机制是为了更好地管理Java虚拟机的内存,这样才能提高程序的运行性能。下面给出几个内存管理的小技巧。
1、尽量使用直接量
当需要使用字符串,还有Byte,Short、integer、Long、Float、Double、Boolean、Character包装类的实例时,不应该采用new的方式来创建对象,而应该使用直接量来创建它们。
2、使用StringBuilder和StringBuffer进行字符创的连接
String、StringBuilder和StringBuffer都可以代表字符串,其中String代表字符序列不可变的字符串,而StringBuilder和StringBuffer都可代表字符序列可变的字符串。如果使用多个String对象进行字符串连接操作,在运行时将生成大量的临时字符串,这些字符串会保存在内存的静态常量池中,可能再也不会用到,从而消耗内存导致性能下降。
3、尽早释放无用对象的引用
大部分时候,方法的局部变量、引用变量所引用的对象的生命周期很短,随着方法的结束而变成垃圾,因此大部分时候无需将局部变量、引用变量显式设为null。
但是倘若遇到下列情况,就要显式设为null了。请看下面的代码:
public void info(){
Object obj = new Object();
System.out.println(obj.toString);
System.out.println(obj.hashCode());
obj=null;
//下面是耗时耗内存的代码
... ...
}
4、尽量少用静态变量
理论上来说,Java对象何时被回收由垃圾回收机制决定,对程序员来说是不确定的。由于垃圾回收机制判断一个对象是否是垃圾的唯一标准就是该对象是否有引用变量引用它,因此推荐尽早释放对象的引用。最坏的情况是某个对象被static变量所引用,那么垃圾回收机制通常是不会回收这个对象所占的内存。因为static变量是类变量,属于某个类,在这个类没有被卸载的情况下,该类对象就会常驻内存。
5、避免在经常调用的方法、循环中创建Java对象
请看下面的代码:
for(int i = 0;i < 10;i++){
Object obj = new Object();
}
上面循环创建了十个Object对象,虽然上面的变量都是局部变量,循环结束时这些局部变量都会失效,但由于这段循环导致Object对象被创建十次,因此系统需要不断的为这10个对象分配内存空间,执行初始化操作。由于这10个对象生命周期很短,接下来系统又要回收它们所占内存,这种不断的分配、回收操作中,系统性能受到很大影响。
6、缓存经常使用的对象
当有些对象需要经常被使用,可以考虑把这些对象用缓冲池保存起来,当下次使用时就可以直接拿出来使用了。典型的缓存就是数据连接池,数据连接里缓存了大量的数据库连接,每次程序需要访问数据库时都可以直接取出数据库连接。
实现缓存通常由两种方式:使用HashMap进行行缓存;直接使用某些开源项目。
注:缓存的设计本身是一种牺牲系统空间来换取运行时间的技术,不管是哪类缓存实现,都会使用容器来保存已用过的对象。对容器的容量控制是缓存设计的关键。
7、尽量不要使用finalize()方法
当一个对象失去引用之后,垃圾回收机制准备回收该对象之前,会先调用该对象的finalize()方法执行资源清理。由于垃圾回收机制的的工作量已经够大了,尤其是回收Young代内存,大都会引起程序暂停,如果再使用finalize()方法,会导致垃圾回收机制的负担更大,导致程序运行效率更差。
8、考虑使用SoftReference对象
当需要创建长度很大的数组时,可以考虑使用SoftReference来包装数组元素。(SoftReference是软引用:当内存足够时,它的功能等同于强引用,当内存不足时它会牺牲自己,释放所引用的对象。由于软引用的不确定性,有可能多获取的对象是null,从而引起空指针异常。)
分享到:
相关推荐
本文章将介绍几则java内存管理的小技巧,让你告别陋习,为自己所编写的java程序提速
内存管理内幕 dragonimp's blog coder.developer.[designer].ArchitecturE.manager.^_^... posts - 29, comments - 121, trackbacks - 27 My Links Home Contact Login News !!! Article ...
懂的其中价值的人来,java内存整理。u can touch with me to the email: 13760613402@163.com
文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...
很多人都说“Java完了,只等着衰亡吧!”,为什么呢?最简单的的例子就是Java...其实从理论上来讲Java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么多理由来证明它确实占内存呢?两个字,陋习。
基于QT开发的人机交互界面,操作系统课程设计,模拟操作系统,具有进程管理,内存管理,磁盘管理,文件系统,设备管理五个功能模块. QT,C++使用技巧,实战应用开发小系统参考资料,源码参考。 详细介绍了一些Qt框架...
调整游标相关参数6月1日 ORA-4030和内存泄漏今日点评优化小技巧 如何分析ORA-40306月2日 优化方案今日点评优化小技巧 一个提供参考的 优化方案优化小技巧 游标的共享6月3日 拆分大型SQL优化小技巧 拆分复杂SQL6月4日...
oracle常用操作技巧,包括oracle安装步骤、网络配制、EM、备份、RMAN的备份与恢复、逻辑备份、闪回、ASM(管理存储软件)、数据迁移、安全控制、oracle安装及常规操作、SQL语句、函数、SQL语句、权限、体系结构、空间...
对于想深入了解堆内存管理的读者,是一个不错的选择。 可见,从使用角度来讲,Visual Leak Detector简单易用,对于使用者自己的代码,唯一的修改是#include Visual Leak Detector的头文件后正常运行自己的程序...
对于想深入了解堆内存管理的读者,是一个不错的选择。 可见,从使用角度来讲,Visual Leak Detector简单易用,对于使用者自己的代码,唯一的修改是#include Visual Leak Detector的头文件后正常运行自己的程序,就...
内存管理:减少全局变量:过多的全局变量会占用静态内存,应尽量使用局部变量存储临时数据。 位操作:利用位操作代替字节或整型变量存储标志位,如使用位域结构体节省空间。 动态内存分配谨慎使用:动态内存分配虽然...
对于想深入了解堆内存管理的读者,是一个不错的选择。 可见,从使用角度来讲,Visual Leak Detector简单易用,对于使用者自己的代码,唯一的修改是#include Visual Leak Detector的头文件后正常运行自己的程序,就...
内存池根据应用不同有多种实现的策略,如有些分配很大的内存,然后将内存分配成大小相等的块,并将每个块链接起来进行管理。 下面对模型介绍的时候,为了简单,不加入用于调试的编写技巧和为之准备的结构,...
《SQL Server 2008管理员必备指南》的特点是按照日常工作的逻辑来编排内容,并含有大量实例操作指导、技巧提示及T-SQL代码,方便管理员日常的工作。 《SQL Server 2008管理员必备指南》适合所有SQL Server用户参考,...
打开“控制面板”,单击“管理工具→本地安全策略→本地策略→安全选项”,双击其中“关机:清理虚拟内存页面文件”一项,单击弹出菜单中的“已启用”选项,单击“确定”即可。 2、如何自行配置WindowsXP的服务...
在Linux下管理磁盘贮存区算的上一个技巧,很多朋友在这上面常常问我,今天我就把这方面的东西汇总一下,从Linux特有的交换分区的原理开始介绍Linux下如何管理磁盘。 1、交换空间是什么 Linux中的交换空间...
AIX简介 AIX技巧: AIX 4.3.3 的中文输入 AIX 的许可权限---ACL AIX常用命令 AIX的版本号代表什么意思?...如何在WINDOWS下制作AIX安装盘在AIX4.3.3系统中,为什么oslevel命令的输出不是怎样查看RS/6000的物理内存
4.2 管理SQL Server配置选项的技巧 82 4.2.1 设置配置选项 82 4.2.2 使用SET选项 83 4.2.3 使用服务器选项 85 4.2.4 使用数据库选项 86 4.2.5 管理数据库的兼容性 87 4.3 通过存储过程配置SQL Server ...
Solaris使用技巧 33 取消root只能在控制台登陆的限制 33 取消root不能登录FTP的限制 33 在从WINDOWS传到UNIX在每行的结尾可能会出现^M 34 取消^M字符: 34 文件名为 -filename 如何去删除 34 ls的特殊用法: 34 Grep...
对于想深入了解堆内存管理的读者,是一个不错的选择。 可见,从使用角度来讲,Visual Leak Detector简单易用,从研究的角度来讲,如果深入研究Visual Leak Detector源代码,可以学习到堆内存分配与释放的原理、内存...