为什么还java中存在内存泄漏吗

轻松搞定JAVA面试之Java 中会存在内存泄漏吗轻松搞定JAVA面试之Java 中会存在内存泄漏吗四十克拉百家号前言--大家好,很快又到周末了,周末对于我们这种IT宅男来说,就是宅着陪电脑,所以今天继续为大家带来一篇JAVA面试文章,希望大家多多转发、收藏、评论、关注本头条号,你们的支持是我持续写作的动力,谢谢。今天我们要探讨的面试题是:Java中会存在内存泄漏吗?我们知道Java内部有一个垃圾回收机制(GC),不像C++(开辟了内存空间还得手动释放),所以理论上java应该不会造成内存泄漏了吧?但是当我们实际做项目开发的时候,就会经常遇到内存泄漏的问题。可能会存在没有用处但是还存在在内存空间的对象,这些对象不能被GC回收,所以这些对象的堆积也会使得内存造成泄漏。比如像hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。我们来看一个实例:上面的代码主要实现的是栈的结构(FILO先进后出),当我们使用它的时候编译测试都能通过,似乎没有什么问题。然而其中的pop方法却存在内存泄露的问题,因为栈内部维护着对这些对象的过期引用(obsoletereference),当我们用pop方法把栈中的对象弹出时,这个对象不能被当作垃圾回收,即使调用这个栈的程序不再引用这些对象。在JAVA中,内存泄露有着很强的隐蔽性,这种内存泄露其实就是无意识的对象保持。如果这样存在被无意识的保持了的对象,那么这个对象中存在的引用的其他的对象也会被无意识保持,垃圾回收器就不会回收这些对象了。当这样的对象越积越多,就很容易造成内存泄漏。欢迎大神们在评论区进行点评,提出不足和改进之处,我只是起到抛砖引玉的作用!本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。四十克拉百家号最近更新:简介:关注手机数码、智能硬件等消费电子类产品。作者最新文章相关文章1.既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存对象会被 GC 认为是&不再使用&的。
Java中对内存对象的访问,使用的是引用的方式。在 Java 代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在 Java 程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。 GC 线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果 GC 线程通过这种方式,无法跟踪到某一块堆内存,那么 GC 就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。
通过这种有向图的内存管理方式,当一个内存对象失去了所有的引用之后,GC 就可以将其回收。反过来说,如果这个对象还存在引用,那么它将不会被 GC 回收,哪怕是 Java 虚拟机抛出 OutOfMemoryError 。
2.java内存泄漏的根本原因是?
答:内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。
3.堆溢出:静态集合类中存储对象
java.lang.OutOfMemoryError: Java heap space
java.lang.StackOverflowError
5.代码栈是什么?
Vector v = new
Vector( 10 );
i = 1 ;i & 100 ; i ++ ){
Object o = new
}在这个例子中,代码栈中存在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 变量,与类实例生命周期相同的要声明为实例变量&&以此类推。第二,在内存对象不再需要时,记得手动将其引用置空。
阅读(...) 评论()答案是肯定的,但不能拿这一句回答面试官的问题。分析:JAVA是支持机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”。如果一个被无意识地保留下来,那么垃圾回收器不仅不会处理这个对象,而且也不处理被这个对象引用的其它对象。“内存泄露”就是内存中某些内存不可被回收。
举个例子:如果对一个栈(Stack类)先是进行入栈操作,之后再进行操作,那么弹出来的对象将不会被当做垃圾回收,即使使用栈的客户程序不再引用这些对象,因为栈内部存在着对这些已弹出对象的引用,这是类自己管理内存的机制所决定的。
阅读(...) 评论()博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》研发主编,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:www.xttblog.com。个人QQ群:、
个人大数据技术博客:https://www.iteblog.com}

我要回帖

更多关于 java是否存在内存泄漏 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信