`
wkf41068
  • 浏览: 452428 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java 内存泄露以及避免方法

阅读更多
内存泄露:
   是指在程序运行过程中会不断的分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证可以保证系统可以再次使用这些内存。如果存在无用的内存没有被收回来,那就是内存泄露。
说明: 对于数组的操作,堆和栈的操作需要慎重的考虑是否存在内存泄露(出栈时没有清理最后一个元素即没有对最后一个元素置空)
垃圾回收机制:
  a. 跟踪并监控每个java对象,当某个对象处于不可达的状态时,就回收该对象所占用的内存。
  b. 清理内存分配、回收过程中产生的内存碎片。

避免内存泄露的小技巧
a. 尽量使用直接量,对于Byte、Short、Integer、Long、Float、Double、Bolean、Character程序不应该使用new 方式创建对象,而采用直接量创建它们。
b. 使用StringBuilder和StringBuffer进行字符串连接
   Sting和StringBuilder以及StringBuffer等都可以代表字符串,其中String字符串代表的是不可变的字符串,后两者表示可变的字符串。
   如果使用多个String对象进行字符串连接运算,在运行时可能产生大量临时字符串,这些字符串会保存在内存中从而导致程序性能下降。

c. 尽量少使用静态变量
类的静态变量的生命周期和类同步的。在类不被卸载的情况下,类对应类对象会常驻内存,知道程序运行结束。
如下代码就会存在内存泄露问题:
class  Person
{
	static Object obj = new Object();
}
d.避免在经常调用的方法、循环中创建Java对象。
e. 缓存经常使用的对象
   如果有些对象需要经常被用到,可以考虑把这些对象用缓存池保存起来,下次用的时候直接从池中拿。典型的就是数据连接池。
   如果系统中还有一些常用的基础信息,可以考虑用缓存,实现缓存的方式有如下两种:
   (1) 使用HashMap进行缓存。
   (2) 直接使用某些开源的缓存项目。
   说明:缓存设计本身就是一直以牺牲系统空间来换取运行时间的技术。   
f. 考虑使用SoftReference
   当程序需要创建长度很大的数组时,可以考虑使用SoftReferene来包装数组元素,而不是直接让将数组元素来引用对象。此时SoftReference是个很好的选择:当内存足够时,它的功能等同于普通引用;当内存不足时,它会牺牲自己,释放软引用所引用的对象。
注意:由于软引用引用对象的不确定性(软引用所获取的对象可能为null),所以程序取出SoftReference所引用的Java之后,应该显式判断该对象是否为null; 当该对象为null时,应该重建该对象。

分享到:
评论

相关推荐

    java避免内存泄露

    虽然java有垃圾自动回收机制,但在写程序时,未及时关闭连接,对象引用未释放等,仍会造成内存泄露,此文章从关闭连接,使用弱引用等方面,介绍了怎样避免内存泄露。

    java之内存泄露

    介绍了java中内存泄露的知识,如:为什么会产生内存泄露,以及通过什么样的方式可以避免内存泄露

    java内存泄露相关资料

    java内存泄露分析与避免办法,同时也提到如何通过jdk自带工具检测内存是否泄露。

    java内存泄露深度分析及解决

    尽管java虚拟机和垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄漏的情况。的确,在大型工程中,内存泄漏是一个普遍问题。避免内存泄漏的第一步,就是要了解他们发生的原因。这篇文章就是...

    理解Java中的内存泄露及解决方法示例

    主要介绍了理解Java中的内存泄露及解决方法示例,本文讲解了Java内存管理机制、Java内存泄露、一般情况下内存泄漏的避免、复杂数据结构中的内存泄露问题等内容,需要的朋友可以参考下

    opencv3和opencv4多线程内存泄漏问题

    opencv3和opencv4多线程内存泄漏问题:以cv::resize函数测试结果为例。 使用中可修复或者可避免内存泄漏:1)使用opencv2的版本;2)在代码中设置修复该问题.

    Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)

    主要介绍了Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)的相关资料,需要的朋友可以参考下

    java基础学习笔记 java整合技术 java工具类.rar

    简单性:相对于其他编程语言而言,java较为简单,例如:java不再支持多继承,C++是支持多继承的,多继承比较复杂,C++中有指针,java中屏蔽了指针的概念,避免了绝大部分的指针越界和内存泄露的问题,这里说明一下,...

    详细分析内部类的发生内存泄漏的原因

    文章目录避免内部类中的内存泄漏步骤1:内部类引用其外部类步骤2:构造函数获取封闭的类引用步骤3:声明一种新方法内存泄漏的解剖 避免内部类中的内存泄漏 使用内部类时要当心垃圾收集 如果您已了解静态类和内部类,...

    Java常见面试问题整理.docx

    在1.8之后,由于永久代内存经常不够用或发生内存泄露,爆出异常OOM,所以在1.8之后废弃永久代,引入元空间的概念。元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。 直接内存:不受JVM ...

    Android内存泄漏的轻松解决方法

    内存管理的目的就是让我们在开发过程中有效避免我们的应用程序出现内存泄露的问题。内存泄露相信大家都不陌生,我们可以这样理解:「没有用的对象无法回收的现象就是内存泄露」。 如果程序发生了内存泄露,则会带来...

    java,c/c++,php,c#安全编码规范

    2.4.8 不要产生内存泄露 20 2.5 异常处理 21 2.5.1 不要忽略捕获的异常 21 2.5.2 不允许暴露异常的敏感信息 21 2.5.3 不允许抛出RuntimeException, Exception,Throwable 22 2.6 多线程编程 23 2.6.1 确保共享变量的...

    java 面试题 总结

    忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 25、short s1 = 1; s1 =...

    java反编译泄露源码-Front-end-questions-to-the-interview-stage-master:前端开发面试问题及

    闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收...

    超级有影响力霸气的Java面试题大全文档

    忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 28、short s1 = 1; s1 =...

    Java经典入门教程pdf完整版

    CLDC的规格之中,只支持java.lang.*、java.io.*、以及java.uti1.*这些类。此版本 也增加了一些攴持“微小装置”的扩充类,如 Javax. microedition.io.*类。然而,此版 木并不支持所有的Java基木类,就标准的 JMECLDO,也...

    android dialogUtil

    废弃使用dialog,避免了内存泄露问题,避免了activity被释放后,dissmiss dialog而导致的问题

    为了面试收集的一些java和安卓的知识点

    内存泄露的根本原因:长生命周期的对象持有短生命周期的对象。短周期对象就无法及时释放。情况如下:静态集合类引起内存泄露,各种数据链接没有关闭,内部类,单例 避免 OOM 异常: 程序需要申请一段“大”内存,...

    亚信java笔试题-FE:前端资源收集

    闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。 Using closures designed primarily to private methods and variables. Closure advantage of global...

    JSTL详细标签库介绍

    java异常处理的基础:<BR><BR>java的异常处理适用于在一个方法中能够检测出错误单不能处理错误的情况,这样方法将抛出一个异常(JAVA无法保证“存在”的异常处理程序能够处理某种异常,若“存在”,就“捕获”异常,...

Global site tag (gtag.js) - Google Analytics