Java程序设计中有关内存管理的其他经验

Java程序设计中有关内存管理的其他经验
根据上面讲解的JVM内存管理系统的工作原理,我们可以通过一些技巧和方式,让JVM做GC处理时更加有效率,更加符合应用程序的要求。以下就是程序设计的一些经验。
(1)最基本的建议就是尽早释放无用对象的引用。大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null。我们在使用这种方式时,必须特别注意一些复杂的对象图,例如数组、队列、树、图等,这些对象之间的相互引用关系较为复杂。对于这类对象,GC回收它们的效率一般较低。如果程序允许,尽早将不用的引用对象赋为null。这样可以加速GC的工作。 例如:
… …
A a = new A();
// 应用a对象
a = null; // 当使用对象a之后主动将其设置为空
… …
但要注意,如果a是方法的返回值,千万不要做这样的处理,否则你从该方法中得到的返回值永远为空,而且这种错误不易被发现。因此这时很难及时抓住、排除NullPointerException异常。
(2)尽量少用finalize函数。finalize函数是Java给程序员提供一个释放对象或资源的机会。但是,它会加大GC的工作量,因此尽量少采用finalize方式回收资源。
(3)如果需要使用经常用到的图片,可以使用soft应用类型。它可以尽可能将图片保存在内存中,供程序调用,而不引起OutOfMemory。
(4)注意集合数据类型,包括数组、树、图、链表等数据结构,这些数据结构对GC来说,回收更为复杂。另外,注意一些全局的变量,以及一些静态变量。这些变量往往容易引起悬挂对象,造成内存浪费。
(5)尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费。
(6)尽量避免强制系统做垃圾内存的回收(通过显式调用方法System.gc()),增长系统做垃圾回收的最终时间,降低系统性能。
(7)尽量避免显式申请数组空间,当不得不显式地申请数组空间时尽量准确地估计出其合理值,以免造成不必要的系统内存开销。
(8)尽量在做远程方法调用(RMI)类应用开发时使用瞬间值(transient)变量,除非远程调用端需要获取该瞬间值(transient)变量的值。
(9)尽量在合适的场景下使用对象池技术以提高系统性能,缩减系统内存开销,但是要注意对象池的尺寸不易过大,及时清除无效对象释放内存资源,综合考虑应用运行环境的内存资源限制,避免过高估计运行环境所提供内存资源的数量。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值