欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JVM面试-Java 中会存在内存泄漏吗,请简单描述

程序员文章站 2022-04-19 16:05:09
...

Java 中会存在内存泄漏吗,请简单描述

所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。Java 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象变成了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC 也是可以回收它们的,例如下面的代码可以看到这种情况的内存回收:

import java.io.IOException;
publicclassGarbageTest{
/*** @param args* @throws IOException */
public static void main(String[] args) throws IOException 
{// TODO Auto-generated method stub 
try
{
gcTest();
} catch(IOException e) 
{// TODO Auto-generated catch block
e.printStackTrace();}
System.out.println("has exited gcTest!");
System.in.read();System.in.read();  System.out.println("out begin gc!");        for(inti=0;i<100;i++){System.gc();System.in.read(); System.in.read();}}
private static void gcTest() throws IOException {
System.in.read();
System.in.read(); 
Person p1 = newPerson();
System.in.read();System.in.read();  
 Person p2 =newPerson();
 p1.setMate(p2);p2.setMate(p1);
 System.out.println("before exit gctest!");
 System.in.read();
System.in.read(); 
System.gc();
System.out.println("exit gctest!");
}

private static class Person{byte[] data = newbyte[20000000];
Person mate = null;
public void setMate(Person other){mate = other;}
     }
}

Java 中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是Java 中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java 中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map 对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
检查Java 中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。

下面内容来自于网上(主要特点就是清空堆栈中的某个元素,并不是彻底把它从数组中拿掉,而是把存储的总数减少,本人写得可以比这个好,在拿掉某个元素时,顺便也让它从数组中消失,将那个元素所在的位置的值设置为null
即可):