博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java既然存在gc线程,为什么还存在内存泄漏?
阅读量:7187 次
发布时间:2019-06-29

本文共 1439 字,大约阅读时间需要 4 分钟。

1.既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存对象会被 GC 认为是“不再使用”的。

Java中对内存对象的访问,使用的是引用的方式。在 Java 代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在 Java 程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。 GC 线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果 GC 线程通过这种方式,无法跟踪到某一块堆内存,那么 GC 就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。

通过这种有向图的内存管理方式,当一个内存对象失去了所有的引用之后,GC 就可以将其回收。反过来说,如果这个对象还存在引用,那么它将不会被 GC 回收,哪怕是 Java 虚拟机抛出 OutOfMemoryError 。

2.java内存泄漏的根本原因是?

答:内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。

3.堆溢出:静态集合类中存储对象

java.lang.OutOfMemoryError: Java heap space

4.栈溢出

java.lang.StackOverflowError

5.代码栈是什么?

答:

Vector v = new  Vector( 10 );   for  ( int  i = 1 ;i < 100 ; i ++ ){   Object o = new  Object();   v.add(o);   o = null ;   } 在这个例子中,代码栈中存在Vector 对象的引用 v 和 Object 对象的引用 o 。 在 For 循环中,我们不断的生成新的对象,然后将其添加到 Vector 对象中,之后将 o 引用置空。问题是当 o 引用被置空后, 如果发生 GC , 我们创建的 Object 对象是否能够被 GC 回收呢? 答案是否定的。 因为, GC 在跟踪代码栈中的引用时, 会发现 v 引用,而继续往下跟踪,就会发现 v 引用指向的内存空间中又存在指向 Object 对象的引用。也就是说尽管 o 引用已经被置空, 但是 Object 对象仍然存在其他的引用,是可以被访问到的,所以 GC 无法将其释放掉。 如果在此循环之后, Object 对象对程序已经没有任何作用, 那么我们就认为此 Java 程序发生了内存泄漏。 7.内存泄漏在哪个领域比较常见? 答:在移动设备对于内存和 CPU都有较严格的限制的情况下, Java 的内存溢出会导致程序效率低下、占用大量不需要的内存等问题。这将导致整个机器性能变差, 严重的也会引起抛出 OutOfMemoryError ,导致程序崩溃。

 8.如何避免内存泄漏?

答:明确引用变量的生命周期,是方法内部的局部变量,还是类实例变量,与类实例生命周期相同的要声明为实例变量。

要避免这种情况下的内存泄露,要求我们以C/C++ 的内存管理思维来管理自己分配的内存。第一,是在声明对象引用之前,明确内存对象的有效作用域。在一个函数内有效的内存对象,应该声明为 local 变量,与类实例生命周期相同的要声明为实例变量……以此类推。第二,在内存对象不再需要时,记得手动将其引用置空。

转载地址:http://edykm.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
[聊聊] (解读)5模13频、5模17频、全网通、双4G,到底是什么?
查看>>
我的友情链接
查看>>
HDS存储管理工具命令行汇总
查看>>
Struts2+Hibernate+Spring+Maven3整合(-)
查看>>
环境变量的4种配置方法
查看>>
跨域访问机制和应用程序域
查看>>
Linux
查看>>
我的友情链接
查看>>
linux 文件归档
查看>>
成为Linux大神计划书
查看>>
jmeter压测网站
查看>>
Windows Server 2012正式版RDS系列⑿
查看>>
aix iostat and vmstat
查看>>
网络工具 Netcat 之端口扫描
查看>>
参观迅达云成公司观后感
查看>>
如何在一台服务器上实现多个Web站点
查看>>
ubantu16.04安装配置samba服务(原创)
查看>>
DB2数据库代码页和实例代码页的区别(解决DB2乱码问题)
查看>>
结合超声计数炎症关节的改良版DAS28的临床应用
查看>>