gc 只能回收通过new 关键字的对象实例,那什么东西gc回收不了,从而引起内存泄露呢?请各位大拿来讲讲?

解决方案 »

  1.   

    有种说法在jni调用非java 代码比如c 的mallac()进行地址分配的情况下,如果在finallize()忘记进行释放内存,就可能会引起 memory leak!!
      

  2.   

    java虚拟机可以自动回收没有被引用的对象。但有时应用程序会有一些对象被引用了但不被使用。这样的对象越来越多的,而虚拟机不能自动回收,就会导致java程序使用的堆越来越多,当超过堆的限制时就会抛出OutOfMemory的错误。在启动java的时候加入 -verbosegc(Jrockit是-verbose:memory或gc)参数。每次垃圾回收都会把回收信息打印到标准输出中。如果回收后的内存时候随时间不断增长。那么应用程序肯定是有内存泄露。
      

  3.   

    还有:
      在一个长生命周期的对象里使用一个短生命周期的对象,gc 能够回收这个短寿命的对象吗?比如一个singleton 对象里组合了一些对象?
      

  4.   

    当他被遗忘在一个被遗忘的角落的时候,特别是Map List Set 之类的。
      

  5.   

    好多的String+String+String以至超过了虚拟机的最大内存
      

  6.   

    以前做过一点研究 收集过一点资料 其中内存泄漏原因如下 你也可google搜索得到
    在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
      

  7.   

    内存泄露:不被使用的有reference的对象。
    在java中,gc机制有n个区,它们共享着jvm的256m内存(这个值可以设)
    新建的对象在新对象区中, 过一定时间后被转移到old area.
    (如果新对象区超过自身75%时,也会进行转移)
    old area 也细分了几个区,当gc机制启动时,old area的某些对象就被清除,释放内存(具体的就不说了,来看看如何造成内存泄露的)gc时,会去old area中查看哪些对象没有reference,找到一个,绝不留情的释放。
    所以,old area中的有reference的对象超过了一定量(比如256m),那就...(另注:不同的vm的gc参数不太一样,但都可以设,例大小,百分比,响应时间)
      

  8.   

    Java的GC采用有向图的方法来进行垃圾回收, main可以看做这个有向图的根节点, 如果从根节点可达的对象为有效对象, 否则为无用对象. 那么什么是内存泄漏呢, 当这个对象已经为无用对象(程序不再使用),但又能够从根节点可达,那么这个对象就无法被GC回收,对服务程序来说就会内存占用越来越多.
    下面举个程序例子
    List list = new ArrayList();
    for (int i = 0; i < 100; i++)
    {
       Object o = new Object();
       list.add(o);
       o = null;
    }
    那么o已经被置成null,但list又包含其引用, 使其不能被释放.
      

  9.   

    4楼的说法是不正确的, 如果你调用malloc方法,你也需要调用free方法, 这个jvm是无法控制的.
    6楼的说法不完全,当你的程序内存占用了超过最大内存限制也会抛出OutOfMemoryException, 如:你将一个1G的文件装载到内存中, 而jvm配置的最大内存限制为512M.
      

  10.   

    13楼的说法有些不正确, java采用有向图的方法避免了循环引用的问题.
      

  11.   

    最好可以详细介绍下,我认为static的容器很容易被遗忘造成泄露.
    jni可以会,比如在swt中
    线程死锁无法正常关闭