A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蒋珍珍 中级黑马   /  2014-4-1 09:02  /  1734 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我知道Java存在内存泄露,但是具体什么情况会产生呢?如何避免呢?求大神们指点

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

6 个回复

倒序浏览
对了,还有那个数据溢出也属于内存泄露吗?
回复 使用道具 举报
解决Java内存泄漏


三. 几种典型的内存泄漏
我们知道了在Java中确实会存在内存泄漏,那么就让我们看一看几种典型的泄漏,并找出他们发生的原因和解决方法.
3.1 全局集合
在大型应用程序中存在各种各样的全局数据仓库是很普遍的,比如一个JNDI-tree或者一个session table.在这些情况下,必须注意管理储存库的大小.必须有某种机制从储存库中移除不再需要的数据.
通常有很多不同的解决形式,其中最常用的是一种周期运行的清除作业.这个作业会验证仓库中的数据然后 清除一切不需要的数据.另一种管理储存库的方法是使用反向链接(referrer)计数.然后集合负责统计集合中每个入口的反向链接的数目.这要求反向链 接告诉集合何时会退出入口.当反向链接数目为零时,该元素就可以从集合中移除了.
3.2 缓存
缓存一种用来快速查找已经执行过的操作结果的数据结构.因此,如果一个操作执 行需要比较多的资源并会多次被使用,通常做法是把常用的输入数据的操作结果进行缓存,以便在下次调用该操作时使用缓存的数据.缓存通常都是以动态方式实现 的,如果缓存设置不正确而大量使用缓存的话则会出现内存溢出的后果,因此需要将所使用的内存容量与检索数据的速度加以平衡.
常用的解决途径是使用java.lang.ref.SoftReference类坚持将对象放入缓存.这个方法可以保证当虚拟机用完内存或者需要更多堆的时候,可以释放这些对象的引用.
3.3 类装载器
Java类装载器的使用为内存泄漏提供了许多可乘之机.一般来说类装载器 都具有复杂结构,因为类装载器不仅仅是只与"常规"对象引用有关,同时也和对象内部的引用有关.比如数据变量,方法和各种类.这意味着只要存在对数据变 量,方法,各种类和对象的类装载器,那么类装载器将驻留在JVM中.既然类装载器可以同很多的类关联,同时也可以和静态数据变量关联,那么相当多的内存就 可能发生泄漏.
4.2处理内存泄漏的方法
一旦知道确实发生了内存泄漏,就需要更专业的工具来查明为什么会 发生泄漏.JVM自己是不会告诉您的.这些专业工具从JVM获得内存系统信息的方法基本上有两种:JVMTI和字节码技术(byte code instrumentation).Java虚拟机工具接口(Java Virtual Machine Tools Interface,JVMTI)及其前身Java虚拟机监视程序接口(Java Virtual Machine Profiling Interface,JVMPI)是外部工具与JVM通信并从JVM收集信息的标准化接口.字节码技术是指使用探测器处理字节码以获得工具所需的信息的技 术.


评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存
最基本的建议是尽早释放无用对象的引用。如:

  ……

  A a = new A();

  //应用a对象

  a = null; //当使用对象a之后主动将其设置为空

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
几种典型的内存泄漏
3.1 全局集合
3.2 缓存
缓存一种用来快速查找已经执行过的操作结果的数据结构,如果缓存设置不正确而大量使用缓存的话则会出现内存溢出的后果,因此需要将所使用

的内存容量与检索数据的速度加以平衡.
常用的解决途径是使用java.lang.ref.SoftReference类坚持将对象放入缓存.这个方法可以保证当虚拟机用完内存或者需要更多堆的时候,可以释放这些对象的引用.
3.3 类装载器
4.2处理内存泄漏的方法
一旦知道确实发生了内存泄漏,就需要更专业的工具来查明为什么会 发生泄漏.JVMTI和字节码技术(byte code instrumentation).Java虚拟机工

具接口(Java Virtual Machine Tools Interface,JVMTI)及其前身Java虚拟机监视程序接口(Java Virtual Machine Profiling Interface,JVMPI)
建议是尽早释放无用对象的引用

我这网速跟不上,就不一一回复了,你们讲的很受教,谢谢啦。
看视频的时候,也听老师讲到了关于修改哈希值再删除哈希集合中对应对象,但是删不掉,这会导致内存泄露,这个好像只能是不要修改集合中的对象的那些参与计算的哈希值了。
看来代码还是要尽量写的规范啊,将无用的对象的引用尽早释放,以便GC回收。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
还有一个。 张老师视频里专门说了, hash集合中有hashcode方法,如果一个被定义参与hashcode运算的成员变量被改变后,它所位于的hash值区域就会改变,这个时候删除这个成员变量所在对象时,会造成内存溢出,因为根本就删不掉这个对象。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
好东西,值得学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马